web-dev-qa-db-fra.com

Quand utiliser l'annotation @Singleton de Jersey?

Je développe un service Web RESTful et lors de la lecture de Jersey documentation je suis tombé sur une annotation @Singleton

Dans mon service Web, je renvoie principalement des données basées sur les clés uniques fournies en tant que paramètre . Une analogie renverrait toutes les informations d'un étudiant lorsque le paramètre Student_Id est transmis.

Ma question est donc la suivante: quand @Singleton conviendrait-il dans ce type de services Web?

Selon la documentation pour @RequestScoped

Si la ressource est utilisée plus d'une fois dans le traitement de la demande, la même instance sera toujours utilisée. 

Alors dans ce cas nous ne devrions pas prendre la peine d’utiliser @Singleton non? 

Aussi, quels pourraient être les cas d'utilisation où nous devons créer une nouvelle instance pour chaque demande?

J'ai jeté un œil à this post mais ma question n’a pas reçu de réponse.

24
Sam

Par défaut, Jersey crée une nouvelle instance de la classe de ressources pour chaque demande. Ainsi, si vous n'annotez pas la classe de ressources Jersey, elle utilise implicitement @RequestScoped scope. Il est indiqué dans documentation Jersey :

Cycle de vie par défaut (appliqué lorsqu'aucune annotation n'est présente). Dans ce portée l'instance de ressource est créée pour chaque nouvelle demande et utilisée pour le traitement de cette demande. Si la ressource est utilisée par plus d'un temps dans le traitement de la demande, toujours la même instance sera utilisée . Cela peut se produire lorsqu'une ressource est une sous-ressource est renvoyée plus fois pendant l'appariement. Dans cette situation, seule l'instance le fera serveur les demandes.

Dans la plupart des cas, vous utilisez ce paramètre par défaut afin de ne pas utiliser @Singleton scope. Vous pouvez également créer une classe de ressources Jersey singleton en utilisant l'annotation @Singleton. Ensuite, vous devez inscrire la classe singleton dans la classe MyApplication, par exemple, 

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

public class MyApplication extends ResourceConfig {

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

Il existe en fait un cas d'utilisation spécifié dans le manuel de Jersey 2 pour l'utilisation de SseBroadcaster lors du traitement d'événements Server-Sent, il est couvert dans cet exemple fourni

La classe de ressources BroadcasterResource est annotée avec l'annotation @Singleton qui indique à l'environnement d'exécution de Jersey qu'une seule instance de la classe de ressources doit être utilisée pour répondre à toutes les demandes entrantes sur le chemin de diffusion. Cela est nécessaire car nous souhaitons conserver une référence unique au domaine du diffuseur privé dans l’ensemble de l’application afin de pouvoir utiliser la même instance pour toutes les demandes. Les clients souhaitant écouter les événements SSE envoient d'abord une demande GET à BroadcasterResource, qui est gérée par la méthode de ressource listenToBroadcast ().

En utilisant le @Singleton, l'application ne contiendra qu'une SseBroadcaster pour toutes les demandes entrantes, un tel diffuseur suffit à desservir plusieurs clients, il ne doit donc être instancié qu'une seule fois!

L'API JAX-RS SSE définit SseBroadcaster qui permet de diffuser des événements individuels vers plusieurs clients.

0
svarog

Dans la plupart des cas, la portée par défaut @RequestScoped devrait suffire à vos besoins. 

@Singleton peut contenir l'état. Je rencontrais le problème lorsque mon noeud final était annoté en tant que @Singleton et qu'il réutilisait le même EntityManager lors d'appels simultanés. Après avoir supprimé @Singleton, lors d'appels simultanés, différentes instances d'objet EntityManager sont utilisées. Si les appels aux terminaux sont ultérieurs, il se peut que l’ancien/ancien EntityManager soit utilisé. - Jersey, Guice et Hibernate - Sécurité du fil EntityManager

0
Justas