webentwicklung-frage-antwort-db.com.de

Wann wird die @Singleton-Annotation von Jersey verwendet?

Ich entwickle einen RESTful Web Service und beim Lesen der Jersey Dokumentation bin ich auf eine Anmerkung gestoßen. @Singleton

In meinem Webservice gebe ich hauptsächlich Daten zurück, die auf den eindeutigen Schlüsseln basieren, die als Parameter ... angegeben wurden. Eine Analogie würde alle Informationen eines Schülers zurückgeben, wenn die Schüler-ID übergeben wird.

Meine Frage ist also, wann @Singleton für solche Web Services geeignet wäre.

Wie in der Dokumentation für @RequestScoped

Wenn die Ressource in der Anforderungsverarbeitung mehr als einmal verwendet wird, wird immer dieselbe Instanz verwendet. 

In diesem Fall sollten wir @Singleton nicht verwenden, oder? 

In welchen Anwendungsfällen müssen wir für jede Anforderung eine neue Instanz erstellen?

Ich habe mir this post angesehen, aber meine Frage wurde nicht beantwortet.

24
Sam

Standardmäßig erstellt Jersey für jede Anforderung eine neue Instanz der Ressourcenklasse. Wenn Sie also die Ressourcenklasse Jersey nicht mit Anmerkungen versehen, wird implizit @RequestScoped scope verwendet. Es ist in Jersey Dokumentation angegeben :

Standardlebenszyklus (wird angewendet, wenn keine Anmerkung vorhanden ist). In diesem Bereich Die Ressourceninstanz wird für jede neue Anfrage erstellt und verwendet zur Bearbeitung dieser Anfrage. Wenn die Ressource mehr als eine .__ verwendet wird. Bei der Anforderungsverarbeitung wird immer die gleiche Instanz verwendet. Dies kann passieren, wenn eine Ressource eine Subressource ist mal während des Matchings. In dieser Situation wird nur auf Instanz Server die Anfragen.

In den meisten Fällen verwenden Sie diese Standardeinstellung, sodass Sie @Singleton scope nicht verwenden. Sie können auch eine Jersey-Ressourcenklasse unter Verwendung der Annotation @Singleton erstellen. Dann müssen Sie die Singleton-Klasse in der MyApplication-Klasse registrieren, z. 

@Path("/resource")
@Singleton
public class JerseySingletonClass {
    //methods ...
}

public class MyApplication extends ResourceConfig {

    /*Register JAX-RS application components.*/
    public MyApplication () {
        register(JerseySingletonClass.class);
    }
}
24
tonga

Kam auf diese Frage, weil ich zum ersten Mal einen Anwendungsfall für nicht mit @Singleton Annotation hatte.

Singleton ist ein Entwurfsmuster. Sie sollten es verwenden, wenn:

  • Das Objekt, das Sie "singletonisieren", behält einen Zustand bei, in dem geteilt und eindeutig gehalten werden muss (Beispiel: ein globaler Zähler).
  • Im Allgemeinen entwerfe ich REST API ohne einen Zustand beizubehalten, alles wird in der Methode behandelt (vollständiger Abschluss): also im Allgemeinen alle Meine Ressourcen sind Singletons (Anwendungsfall: bessere Leistung)

Das heißt, heute habe ich diesen Anwendungsfall gefunden, um Singleton nicht zu verwenden:

@Path("/someendpoint/{pathparam}/somethingelse/")
//@Singleton
public class MyResource {
    @PathParam("pathparam")
    private String pathparam;
}

Auf diese Weise beschränke ich den Pfadparameter auf meine Instanz, daher ist muss RequestScoped. Im Allgemeinen hätte ich @PathParam-Annotation in jede Methode eingefügt, sodass @Singleton genau richtig für die Klasse gewesen wäre.

Ich bin mir bei den Performances nicht sicher, aber das Erstellen und Zerstören eines Objekts ist keine kostenlose Operation

1
besil

Im Jersey 2-Handbuch ist tatsächlich ein Anwendungsfall für die Verwendung von SseBroadcaster beim Servern von Server-Sent-Ereignissen angegeben. In diesem Beispiel wird darauf hingewiesen

Die Ressourcenklasse BroadcasterResource ist mit der @Singleton-Annotation versehen, die der Jersey-Laufzeitumgebung mitteilt, dass nur eine einzelne Instanz der Ressourcenklasse für alle eingehenden Anforderungen an/Broadcast-Pfad verwendet werden soll. Dies ist erforderlich, da wir einen anwendungsweiten Einzelverweis auf das Feld des privaten Senders beibehalten möchten, damit wir dieselbe Instanz für alle Anforderungen verwenden können. Clients, die SSE - Ereignisse abhören möchten, senden zuerst eine GET-Anforderung an die BroadcasterResource, die von der Ressourcenmethode listenToBroadcast () verarbeitet wird.

Wenn Sie @Singleton verwenden, enthält die Anwendung nur eine SseBroadcaster für alle eingehenden Anforderungen. Ein solcher Broadcaster reicht aus, um mehrere Clients zu bedienen. Daher muss er nur einmal instanziiert werden!

Die API JAX-RS SSE definiert SseBroadcaster, mit dem einzelne Ereignisse an mehrere Clients gesendet werden können.

0
svarog

In den meisten Fällen sollte der Standardbereich @RequestScoped für Ihre Anforderungen ausreichend sein. 

@Singleton kann den Status halten. Ich hatte das Problem, als mein Endpunkt als @Singleton kommentiert wurde, sodass er dieselbe EntityManager während gleichzeitiger Aufrufe wiederverwendete. Nach dem Entfernen von @Singleton während gleichzeitiger Aufrufe werden verschiedene EntityManager Objektinstanzen verwendet. Wenn Endpunktaufrufe aufeinander folgen, kann es sein, dass die vorherige/alte EntityManager verwendet wird. - Jersey, Guice und Hibernate - EntityManager-Threadsicherheit

0
Justas