2013-08-15 19 views
8

Utilizzo JAX-RS (implementazione di jersey) per creare un servizio Web.JAX-RS: getClasses vs getSingletons

Il punto di accesso all'applicazione Web è una classe che si estende Application e sovrascrive il metodo getClasses. Capisco che JAX-RS creerà una nuova istanza per ogni nuova richiesta.

È possibile ignorare invece getSingleton. La mia comprensione è che questo riutilizzerà la stessa istanza per tutte le richieste. Tuttavia, questo approccio (supponendo che io sia corretto) non distruggerà la concomitanza all'interno dell'applicazione web? Cioè, poiché la stessa istanza è sempre utilizzata, le richieste in entrata verranno elaborate una alla volta (FIFO?).

risposta

15

No, non lo farà. Più thread in JVM sono in grado di accedere a un'istanza di una classe nello stesso momento (invocare un metodo di risorsa sulla risorsa in questo caso). Devi solo assicurarti che la tua risorsa sia sicura per i thread.

Per illustrare la differenza tra getClasses() e getSingletons() lascia supporre abbiamo un HelloWorldResource come:

@Path("helloworld") 
public class HelloWorldResource { 

    private volatile int counter = 0; 

    @GET 
    @Produces("text/plain") 
    public String getHello() { 
     return "Hello World! " + counter++; 
    } 

} 

più invocazioni di getHello metodo di risorsa restituirebbe voi:

  • nel caso in cui si registra il risorsa via getClasses

    Hello World! 0 
    Hello World! 0 
    Hello World! 0 
    ... 
    
  • nel caso in cui si utilizza getSingletons per registrare la vostra risorsa

    Hello World! 0 
    Hello World! 1 
    Hello World! 2 
    ... 
    
+1

più un dubbio che ho circa la firma di questi metodi. Uno sta tornando Set e altro è Set >, perché? Quando entrambi i metodi hanno lo stesso scopo, il loro tipo di ritorno dovrebbe essere lo stesso. – sHAILU

+2

"Il metodo getSingletons() restituisce istanze reali create dall'utente all'interno dell'implementazione della classe Application. Si utilizza questo metodo quando si desidera avere il controllo sulla creazione di istanze delle classi di risorse e dei provider. Ad esempio, forse si sta utilizzando Spring per creare un'istanza degli oggetti JAX-RS o per registrare un EJB che utilizza annotazioni JAX-RS. " - fonte: http://java.dzone.com/articles/putting-java-rest –