Мне бы хотелось узнать правильный / лучший способ обработки параллелизма с помощью веб-службы Axis2.
Например, учитывая этот код:
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
аутентифицируемой сессии.
Правильно ли я считаю, что это утверждение не является потокобезопасным? IE., Учитывая два потока, возможно ли следующее?
- Тема A:
service.setJSESSIONID("threadA")
- Тема B:
service.setJSESSIONID("threadB")
- Тема A:
service.getCustomerFromSessionID // service.sesionID == "threadB"
Если так, каков наиболее подходящий способ справиться с этой ситуацией? Должен ли я использовать пул ресурсов для обслуживания? Или я должен объявить службу как синхронизированную?
public CustomerDTO getCustomer()
{
synchronized( service ) {
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
}
Или есть другой, более подходящий способ решения этой проблемы?