2013-08-15 23 views
8

Używam JAX-RS (implementacja Jersey) do zbudowania usługi internetowej.JAX-RS: getClasses vs getSingletons

Punkt wejścia do aplikacji internetowej jest klasą, która rozszerza Application i zastępuje metodę getClasses. Rozumiem, że JAX-RS utworzy nowe wystąpienie dla każdego nowego żądania.

Zamiast tego można zastąpić getSingleton. Rozumiem, że będzie to ponowne użycie tej samej instancji dla wszystkich żądań. Jednak czy to podejście (zakładając, że jestem poprawny) nie zniszczy współbieżności w aplikacji internetowej? To znaczy, ponieważ ta sama instancja jest zawsze używana, żądania przychodzące będą przetwarzane pojedynczo (FIFO?).

Odpowiedz

15

Nie, nie będzie. Wiele wątków w JVM może uzyskać dostęp do jednej instancji klasy w tym samym czasie (w tym przypadku należy wywołać metodę zasobu dla zasobu). Musisz tylko upewnić się, że twój zasób jest bezpieczny dla wątków.

Aby zilustrować różnicę między getClasses() i getSingletons() Załóżmy mamy HelloWorldResource jak:

@Path("helloworld") 
public class HelloWorldResource { 

    private volatile int counter = 0; 

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

} 

Wielokrotne wywołania getHello metody zasobów wrócą ci:

  • w przypadku zarejestrujesz swój zasób przez getClasses

    Hello World! 0 
    Hello World! 0 
    Hello World! 0 
    ... 
    
  • w przypadku korzystania getSingletons zarejestrować Twój zasób

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

Jeden więcej wątpliwości mam o podpisaniu tych metod. Jeden wraca Set , a drugi to Set >, dlaczego? Gdy obie metody mają ten sam cel, wówczas ich typ powrotu powinien być taki sam. – sHAILU

+2

"Metoda getSingletons() zwraca rzeczywiste instancje, które sam tworzysz w ramach implementacji klasy Application. Ta metoda służy do kontroli tworzenia instancji klas zasobów i dostawców. Na przykład, może używasz Spring aby utworzyć instancję obiektów JAX-RS lub chcesz zarejestrować komponent EJB wykorzystujący adnotacje JAX-RS. " - źródło: http://java.dzone.com/articles/putting-java-rest –