2013-06-11 15 views
5

Jest coś nie jestem pewien, czy rozumiem correctlty więc potrzebuję pomocy :)Jak zachowuje się "punkt końcowy" JAX-RS podczas wysyłania zapytania?

Widziałem to: example,

@Path("/resource") 
public class Resource { 
    @Context 
    private HttpHeaders headers; 

    @GET 
    public void get(@Context UriInfo uriInfo) { 
     /* use headers or uriInfo variable here */ 
    } 
} 

Czy to oznacza, że ​​dla każdego żądania klasy, która jest przekształcana do "punktu końcowego" tworzy oddzielny wątek? Ponieważ w przeciwnym razie informacje w nagłówkach nie byłyby dokładne ...

Czy możesz wskazać (krótki :)) zasób, a nie specyfikacje JAX-WS, gdzie mogę znaleźć informacje na ten temat?

+0

Nowy wątek nie zawsze jest tworzony. Ale jesteś pewny, że 'get()' i 'headers' są lokalne dla żądania HTTP. –

Odpowiedz

9

Nie mogę myśleć o krótszym i bardziej bezpośrednim źródle niż JAX-RS 1.1 spec itself. Jest oczywiste, o what you are asking:

JAX-RS zapewnia udogodnienia dla uzyskiwania i przetwarzania informacji o kontekście wdrażania aplikacji i kontekście indywidualnych żądań. (...)

Kontekst jest specyficzny dla konkretnego żądania (...).

Czy mogę dodać do kompletności: ta informacja kontekstowa jest uzyskiwana za pomocą adnotacji @Context. W przypadku zasobów informacje kontekstowe są dostępne tylko dla tych oznaczonych jako @Path (zwanych także zasobami root). Również @Context można wstrzykiwać następujące context types: Application, UriInfo, HttpHeaders, Request, SecurityContext i Providers.

io lifecycle (request/zarządzanie gwint):

3.1.1 Lifecycle i Środowisko

domyślnie nowa klasa zasób instancja jest tworzony dla każdego żądania do tego zasobu. Najpierw konstruktor jest wywoływany, , następnie żądane zależności są wstrzykiwane (kontekst jest jedną z tych zależności), następnie wywoływana jest odpowiednia metoda, a na koniec obiekt jest udostępniany do usuwania śmieci.

Implementacja MAY oferuje inne cykle życia zasobów, mechanizmy określania tych są poza zakresem niniejszej specyfikacji. Na przykład. implementacja oparta na schemacie inwersji sterowania może obsługiwać wszystkie opcje cyklu życia zapewniane przez tę strukturę.

Wniosek jest taki:

  • Każda prośba jest domyślnie obsługiwany przez inny przykład zasobów;
  • Kontekst jest wstrzykiwany w czasie żądania (a zatem inny kontekst dla każdej instancji).

Każda konkretna implementacja może nieco zmienić ten cykl życia, ale zasady powinny być zachowane (kontekst specyficzny dla każdego żądania).

Jak widać, specyfikacja nie mówi nic o zarządzaniu wątkami. Ponieważ większość implementacji JAX-RS opiera się na Servlet, możemy z pewnym bezpieczeństwem założyć, że każda instancja żądania przechodzi do innego wątku - ponieważ kontenery serwletów są wątkami na żądanie.

+0

Zastanawiam się również nad tym. Zgadzam się, że każde żądanie jest obsługiwane przez osobny wątek, ale wiele wątków często ma te same klasy dla wydajności. Używanie @Context wydaje się w ogóle nie być bezpieczne dla wątków! –

+0

Alex, te współużytkowane klasy powinny być zakodowane tak, aby były bezpieczne dla wątków, co oznacza, że ​​same powinny synchronizować dostęp do kluczowych zasobów w nich. – inor

Powiązane problemy