Je voudrais savoir la bonne/meilleure façon de gérer la simultanéité avec un webservice Axis2.Java simultané: Rendre l'accès webservice threadsafe
Par exemple, étant donné ce code:
public class MyServiceDelegate
{
@Resource
UserWebService service; // Injected by spring
public CustomerDTO getCustomer()
{
String sessionString = getSessionStringFromCookies();
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
}
Notez que dans ce qui précède que UserWebService est une API 3ème partie. Le service nécessite que lors de l'appel, nous passons un cookie avec le JSESSIONID
d'une session authentifiée.
Ai-je raison de supposer que cette instruction n'est pas threadsafe? IE., Donné deux threads, est-il possible que ce qui suit se produise?
- ThreadA:
service.setJSESSIONID("threadA")
- ThreadB:
service.setJSESSIONID("threadB")
- ThreadA:
service.getCustomerFromSessionID // service.sesionID == "threadB"
Si oui, quelle est la meilleure façon de gérer cette situation? Dois-je utiliser un pool de ressources pour le service? Ou devrais-je déclarer le service comme synchronisé?
public CustomerDTO getCustomer()
{
synchronized(service) {
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
}
Ou existe-t-il une autre façon plus appropriée de résoudre ce problème?
Ceci est possible, mais semble cher. Actuellement, le délégué est déclaré comme un haricot de printemps, avec une portée singleton. Nous pourrions changer cela pour utiliser un prototype, instanciant ainsi le délégué et le service à chaque fois, cependant, cela semble beaucoup de frais généraux. Y a-t-il un meilleur moyen? –
édité pour ajouter un design alternatif – djna