我想知道處理Axis2 web服務併發的正確/最好的方法。Java併發:使Web服務訪問線程安全
例如,鑑於此代碼:
public class MyServiceDelegate
{
@Resource
UserWebService service; // Injected by spring
public CustomerDTO getCustomer()
{
String sessionString = getSessionStringFromCookies();
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
}
注意的是,在那上面UserWebService是一個第三方API。該服務要求在撥打電話時,我們通過一個包含經過驗證會話的JSESSIONID
的cookie。
我正確的假設這條語句不是線程安全的嗎? IE。給出兩個線程,是否可能發生以下情況?
- 的ThreadA:
service.setJSESSIONID("threadA")
- ThreadB:
service.setJSESSIONID("threadB")
- 的ThreadA:
service.getCustomerFromSessionID // service.sesionID == "threadB"
如果是這樣,什麼是處理這種情況的最合適的方法是什麼?我應該使用資源池進行服務嗎?或者我應該宣佈服務同步?
public CustomerDTO getCustomer()
{
synchronized(service) {
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
}
或者,是否有另一種更合適的方法來處理這個問題?
這是可能的,但看起來很昂貴。目前該委託被聲明爲一個spring bean,具有單例作用域。我們可以將其改爲使用原型,從而每次實例化委託和服務,但是,這似乎是一個很大的開銷。有沒有更好的辦法? – 2009-08-03 09:26:19
編輯添加替代設計 – djna 2009-08-03 09:32:07