2012-11-29 18 views
5

Myślę, że mam tutaj podstawowy problem zrozumienia i mam nadzieję, że ktoś może mi to wyjaśnić.JAVA EE 6 współudział między stanową EJB

Powiedzmy mamy pełnostanowego EJB_A i stanowe EJB_B i sessionscoped ManagedbeanA:

@Stateful 
@LocalBean 
public class EJB_A { 
} 

@Stateful 
@LocalBean 
public class EJB_B { 
    @EJB 
    EJB_A ejb; 
} 
@ManagedBean 
@SessionScoped 
public class ManagedBeanA { 
    @EJB 
    EJB_A ejb; 
} 

W ManagedBeanA The EJB_A jest tworzony. Teraz, gdy używam EJB_B, który ma EJB_A jako właściwość, w EJB_B tworzona jest nowa instancja EJB_A. To nie jest to samo wystąpienie EJB_A, które zostało wcześniej utworzone w ManagedBeanA.

Nie rozumiem tego, ponieważ uważałem, że cały stan stanowych EJB polega na tym, że dla każdego klienta tworzone jest tylko jedno wystąpienie, które jest współdzielone i zarządzane przez kontener EJB. Czy ktoś może mi to wyjaśnić? I proszę wyjaśnić, w jaki sposób mogę osiągnąć, że to samo wystąpienie EJB jest współdzielone przez wiele innych EJB?

Dziękuję

+0

Kiedy mówisz " Teraz, kiedy używam EJB_B "co masz na myśli? Jak zweryfikowałeś, że to nie to samo wystąpienie? –

+0

Po wysłaniu instancji EJB_B i przejrzeniu właściwości (na przykład właściwości łańcuchowej) EJB_A, właściwości komponentu bean EJB_A różnią się od właściwości obiektu EJB_A, który został zainicjowany przez zarządzany komponent bean. – user1727072

+0

Gdzie "zainicjować" EJB_B; w innym ManagedBean lub Java Client (wyszukiwanie zdalne)? –

Odpowiedz

9

Tak, można mieszać różne koncepcje i różnych API zbyt ... wolałbym użyć @Inject nad @EJB i określać zakres wtryskiwanego przykład ..

@Stateful 
@LocalBean 
public class EJB_A { 
} 

@Stateful 
@LocalBean 
public class EJB_B { 
    @Inject @SessionScoped 
    EJB_A ejb; 
} 
@ManagedBean 
@SessionScoped 
public class ManagedBeanA { 
    @Inject @SessionScoped 
    EJB_A ejb; 
} 
+0

czy możesz wyjaśnić, dlaczego powinienem używać @Inject zamiast @EJB? – user1727072

+1

Cóż, szczegółowa dyskusja na ten temat znajduje się pod adresem: [link] http://www.seamframework.org/107780.Loc Zasadniczo czynnikiem dyskryminującym jest to, że '@ Inject' zawsze ma świadomość zakresu wstrzyknięto obiekt i jesteś pewien, że wstrzyknięta instancja jest zarządzana (zapobiegając w ten sposób nieprzyjemnym zdalnym problemom serializacji fasoli). Korzystając z '@ Inject' uzyskujesz (czasami proxy) obiekt zarządzany, używając' @ EJB', uzyskujesz zasób, niewiele różniący się od prostego wyszukiwania JNDI –

+0

dziękuję, które bardzo dużo dla mnie wyjaśnia :)! – user1727072

1

Chyba miesza się dwie rzeczy - @Sessionscoped i @Stateful.

@ Uwaga adnotacji nie oznacza, że ​​tworzone jest tylko jedno wystąpienie na klienta. Oznacza to tylko, że @ Stateful-EJB należy do jednego klienta, podczas gdy @ Stateless-EJB może być współużytkowany przez wielu klientów.

Tak więc @ stateful-EJB ma relację N: 1 (N @ Stateful-EJB należą do dokładnie JEDNEGO klienta), a @ Stateless-EJB ma relację N: M (N @ Stateless-EJBS należy do klientów M). Oznacza to, że instancja EJB nie może być współużytkowana przez wiele innych komponentów EJB za pomocą funkcji @ EJB-Adnotation dla @ Eks.

Wygląda na to, że @ Sessionscoped-Managedbean jest tworzony tylko raz dla każdego klienta.

Czy to rozumiem?

2

Właśnie przeczytałem here.

Powodem jest to, że każdy lookup() o EJB 3.0 sesji Stateful fasoli wyniki interfejsu zdalnego lub lokalnego biznesu w tworzeniu nowej fasoli tożsamości. Każda referencja zwrócona przez odnośnik odnosi się do innej, pełzającej, stanowej fasoli sesyjnej. Od osoby dzwoniącej zależy, czy chce ona zarządzać dostępem do tego pliku referencyjnego. Zazwyczaj aplikacja WWW będzie przechowywać odniesienie w zasięgu aplikacji HttpSession lub (ServletContext) dla późniejszego dostępu.

I:

Nie zapomnij w danym przypadku mamy do czynienia z 2 rodzajów sesji: w fasoli sesji i sesji internetowej. Pierwsza z nich zapewnia, że ​​po wysłaniu przez użytkownika żądania stanowego komponentu bean jego tożsamość pozostanie taka sama w całej sesji użytkownika . Ale kiedy używasz tego ostatniego, masz sesję internetową na szczycie sesji komponentu bean. Aby zapewnić dostęp do tego samego komponentu bean z poziomu 2 różnych stron JSP (lub po przeładowaniu), należy zapisać tożsamość komponentu bean w zakresie sesji WWW.

Więc masz rację.Kiedy chcesz użyć swojej instancji, musisz użyć ManagedBean, aby pobrać ją gdzie indziej, ponieważ instancja EJB jest powiązana z tym kontekstem sesji. Jeśli chcesz go uprościć i upewnić się, że EJB istnieje tylko raz na sesję, użyj CDI i dodaj adnotację do samego EJB wraz z @javax.enterprise.context.SessionScoped; niż możesz być tego pewien.

+0

dziękuję bardzo pomocne! – user1727072