Frage

Ich mag den richtigen / besten Weg, wissen, Gleichzeitigkeit mit einem Axis2 webservice zu behandeln.

Zum Beispiel, da diesen Code ein:

public class MyServiceDelegate
{
    @Resource
    UserWebService service; // Injected by spring

    public CustomerDTO getCustomer()
    {
       String sessionString = getSessionStringFromCookies();
       service.setJSESSIONID(sessionString);
       CustomerDTO customer = service.getCustomerFromSessionID();
    }
}

Beachten Sie, dass in dem über diesem UserWebService ist ein 3rd-Party-API. Der Dienst erfordert, dass beim Telefonieren, wir ein Cookie mit dem JSESSIONID einer authentifizierten Sitzung übergeben.

Bin ich in der Annahme richtig, dass diese Aussage thread nicht wahr? IE., Zwei Threads angegeben, ist es möglich, dass die folgende auftreten?

  • ThreadA: service.setJSESSIONID("threadA")
  • ThreadB: service.setJSESSIONID("threadB")
  • ThreadA: service.getCustomerFromSessionID // service.sesionID == "threadB"

Wenn ja, was ist der am besten geeignete Weg, um diese Situation zu bewältigen? Soll ich einen Ressourcenpool für Service nutzen? Oder sollte ich erklären Dienst als synchronisiert?

    public CustomerDTO getCustomer()
    {
       synchronized( service ) {
          service.setJSESSIONID(sessionString);
          CustomerDTO customer = service.getCustomerFromSessionID();
       }
    }

Oder gibt es eine andere, geeignetere Weg, um dieses Problem zu umgehen?

War es hilfreich?

Lösung

Würde jeder Thread seinen eigenen Delegierten bezwecken und damit seinen eigenen UserWebService Service?

Im einfachen Fall, wenn die Delegierten auf dem Stapel erstellt werden die Fäden unabhängig sein würden.

Wenn die Kosten für die Erstellung hoch ist, haben einen Pool von den Delegierten Objekte. ein von teh Pool zu nehmen ist comparativley billig. Sie müssen sehr vorsichtig mit der Hauswirtschaft sein, aber effektiv ist, was mit Datenbankverbindungen erfolgt. Einige Umgebungen haben Utility-Klassen für eine solche Bündelung der Verwaltung -. Neigt dazu, rollen Sie Ihre eigenen vorzuziehen zu sein

Andere Tipps

Ist UserWebService eine Ihrer Klassen? Wenn ja, ich glaube, ich die Methode Signatur ändern würde an:

public CustomerDTO getCustomer()
{
      CustomerDTO customer = service.getCustomerFromSessionID(sessionString);
}

Und nicht hat Ihre UserWebService Zustand halten, so wird es von Natur aus Thread-sicher

Wie Sie gesagt haben, ist die Funktion nicht Thread-sicher. Java hat eine einfache Art und Weise überwacht zu machen, die ein Objekt ist, das nur einen nach dem anderen mit einer Funktion für den Zugriff auf Gewinde ermöglicht. Weitere Informationen über Monitore

Um es sicher zu machen einfädeln können Sie entweder synchronisiert Stoßen, wie Sie den Ausdruck tat, um oder vor dem Funktionsname:

public synchronized CustomerDTO getCustomer(){
    service.setJSESSIONID(sessionString);
    CustomerDTO customer = service.getCustomerFromSessionID();
}

Der Unterschied zwischen den beiden ist, das Objekt, das Sie in einen Monitor drehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top