Bezpaństwowe i Stateful Enterprise Java Beans

Przechodzę przez samouczek Java EE 6 i próbuję zrozumieć różnicę między stateless i stateful session beans. Jeśli bezpaństwowe ziarna sesji nie zachowują swojego stanu pomiędzy wywołaniami metody, Dlaczego mój program zachowuje się tak,jak jest?

package mybeans;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

@LocalBean
@Stateless
public class MyBean {

    private int number = 0;

    public int getNumber() {
        return number;
    }

    public void increment() {
        this.number++;
    }
}

Klient

import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import mybeans.MyBean;
import java.io.PrintWriter;

@WebServlet(name = "ServletClient", urlPatterns = { "/ServletClient" })
public class ServletClient extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @EJB
    MyBean mybean;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        mybean.increment();
        out.println(mybean.getNumber());
    }

}

Spodziewałem się, że getNumber zwróci 0 za każdym razem, ale zwraca 1 i przeładowania servletu w mojej przeglądarce zwiększają go bardziej. Problem jest z moim zrozumieniem, jak bezpaństwowa sesja beans działa, a nie z bibliotekami lub serwerem aplikacji, oczywiście. Czy ktoś może mi podać prosty przykład typu hello world z sesją bezstanową, która zachowuje się inaczej po zmianie NA stateful?

Author: dit, 2010-02-28

6 answers

Istotną różnicą nie są prywatne zmienne członkowskie, ale powiązanie stanu z konkretnym użytkownikiem(pomyśl "koszyk").

Stateful piece of stateful session bean jest jak sesja w servletach. Stateful session Beans pozwala aplikacji nadal mieć tę sesję, nawet jeśli nie ma klienta sieci web. Gdy serwer aplikacji pobiera bezpaństwową sesję z puli obiektów, wie, że może ona zostać użyta do spełnienia każdego żądania, ponieważ nie jest powiązana z konkretnego użytkownika.

Stateful session bean musi być wydany użytkownikowi, który go w pierwszej kolejności otrzymał, ponieważ informacje o koszyku powinny być znane tylko im. Serwer aplikacji zapewnia, że tak jest. Wyobraź sobie, jak popularna byłaby Twoja aplikacja, gdybyś mógł zacząć robić zakupy, a następnie serwer aplikacji dał mi Twoją stateful session bean, gdy się pojawiłem!

Więc twój prywatny członek danych jest rzeczywiście "stan", ale to nie jest"koszyk". Spróbuj powtórzyć swój (bardzo dobry) przykład do zrób tak, aby zmienna przyrostowa była powiązana z konkretnym użytkownikiem. Zwiększ ją, utwórz nowego użytkownika i sprawdź, czy nadal może zobaczyć zwiększoną wartość. Jeśli zrobione poprawnie, każdy użytkownik powinien zobaczyć tylko swoją wersję licznika.

 88
Author: duffymo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-28 13:57:09

Stateless Session Beans (SLSB) nie są powiązane z jednym klientem i nie ma żadnej gwarancji dla jednego klienta, aby uzyskać tę samą instancję przy każdym wywołaniu metody (niektóre kontenery mogą tworzyć i niszczyć beans przy każdej sesji wywołania metody, jest to decyzja specyficzna dla implementacji, ale instancje są zazwyczaj łączone - i nie wspominam o środowiskach klastrowych). Innymi słowy, chociaż bezstanowe ziarna mogą mieć zmienne instancyjne, pola te nie są specyficzne dla jednego klient, więc nie polegaj na nich między zdalnymi połączeniami.

W przeciwieństwie do tego, Stateful Session Beans (SFSB) są dedykowane jednemu Klientowi przez całe życie, nie ma zamiany ani łączenia instancji (może być eksmitowany z pamięci po pasywacji, aby oszczędzać zasoby, ale to już inna historia) iutrzymać stan konwersacji . Oznacza to, że zmienne instancji bean mogą przechowywać dane względem Klienta pomiędzy wywołaniami metody. A to umożliwia mają współzależne wywołania metody(zmiany dokonane przez jedną metodę wpływają na kolejne wywołania metody). Procesy wieloetapowe (proces rejestracji, koszyk, proces rezerwacji...) są typowymi przypadkami użycia SFSB.

Jeszcze jedno. Jeśli używasz SFSB, to musisz unikać wstrzykiwania ich do klas, które mają charakter wielowątkowy, takich jak Servlets i JSF managed beans (nie chcesz, aby były współdzielone przez wszystkich klientów). Jeśli chcesz użyć SFSB w swojej aplikacji internetowej, to należy wykonać wyszukiwanie JNDI i zapisać zwróconą instancję EJB w obiekcie HttpSession dla przyszłej aktywności. Coś w tym stylu:
try {
    InitialContext ctx = new InitialContext();
    myStateful = (MyStateful)ctx.lookup("java:comp/env/MyStatefulBean");
    session.setAttribute("my_stateful", myStateful);
} catch (Exception e) {
    // exception handling
}
 129
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-28 15:32:39

Bezpaństwowość i stanowość w tym kontekście nie oznacza dokładnie tego, czego można się spodziewać.

Stan z EJBs odnosi się do tego, co nazywam stanem konwersacyjnym. Klasycznym przykładem jest rezerwacja lotu. Jeśli składa się z trzech kroków:

  • miejsce rezerwowe
  • doładowanie karty kredytowej
  • Wystaw Bilet

Wyobraź sobie, że każdy z nich jest wywołaniem metody do fasoli sesji. Stateful session bean może utrzymywać tego rodzaju konwersację , więc pamięta, co zdarza się między telefonami.

Bezstanowe fasole sesji nie mają takiej zdolności do stanu konwersacji.

Zmienne globalne wewnątrz fasoli sesji (stateless lub stateful) to coś zupełnie innego. Stateful session beans będzie miał pulę ziaren utworzoną (ponieważ fasola może być używana tylko w jednej rozmowie na raz) , podczas gdy stateless sesion beans będzie często miał tylko jedną instancję, która sprawi, że zmienna globalna będzie działać, ale nie sądzę, że jest to koniecznie gwarantowane.

 16
Author: cletus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-28 13:59:06

Dzieje się tak, ponieważ kontener ma tylko jedną instancję bean w puli, która jest ponownie używana dla wszystkich wywołań. Jeśli uruchomisz klientów równolegle, zobaczysz inny wynik, ponieważ kontener utworzy więcej wystąpień bean w Puli.

 4
Author: Neyma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-28 22:25:29

Główne różnice między dwoma głównymi typami sesji to:

Fasola Bezpaństwowa

  1. Stateless Session Beans to te, które nie mają stanu konwersacji z klientem, który wywołał swoje metody. Z tego powodu mogą tworzyć pulę obiektów, które mogą być używane do interakcji z wieloma klientami.
  2. wydajność mądre bezstanowe ziarna są lepsze, ponieważ nie mają stanów na klienta.
  3. mogą obsługiwać wiele żądania od wielu klientów równolegle.

Stateful Beans

  1. Stateful session beans może utrzymywać stan konwersacji z wieloma klientami naraz, a zadanie nie jest dzielone między klientami.
  2. po zakończeniu sesji stan nie jest zachowany.
  3. kontener może serializować i przechowywać stan jako Stan nieświeży do wykorzystania w przyszłości. Ma to na celu oszczędzanie zasobów serwera aplikacji oraz obsługę bean porażki.
 3
Author: Pritam Banerjee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 20:08:31

Ma dobre odpowiedzi. Chciałbym dodać małą odpowiedź. Stateless Bean nie powinien być używany do przechowywania żadnych danych Klienta. Należy go używać do "modelowania działań lub procesów, które można wykonać w jednym ujęciu".

 2
Author: malatesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-27 05:26:22