ссылка на remote Stateless EJB и многопоточность
От: AlexL_ Россия  
Дата: 13.08.10 12:38
Оценка:
Всем привет!

У меня есть несколько потоков, которым нужен EJB для выполнения бизнес-логики.
У меня есть ссылка на remote интерфейс. Получил я её так: home.create();
Мне надо: потоко-безопасность, если вызываем методы в нескольких потоках одновременно, чтобы вызывались методы у разных бинов.

Вопрос: можно ли расшарить эту ссылку на несколько потоков? Будет ли это потоко-безопасно? Например, вызываю метод в одном потоке, бин долго работает, в это время вызываю метод и в другом потоке, будет ли создан еще один бин и вызовется ли метод у другого бина? Или в каждом потоке нужно делать lookup и home.create()?

EJB 2.1.

Читаю J2ee tutorial 1.4. Написано, что когда мы получаем ссылку на remote, то передаем в метод home.create() параметры, необходимые для создания объекта remote. В моем случае, параметров нет. Получается, что контейнер вроде как не может сам создать объекты, т.к., теоретически, ему надо знать параметры, которые могут быть преданны в ejbCreate(...).
Но! Дебажу под weblogic 9.2, ставлю брейкпоинт на onEjbCreate(), и он вызывается больше одного раза(а у меня в коде только 1 раз вызывается home.create(), а дальше ссылка просто расшаривается между потоками)! То есть, на практике, всё оказывается thread-safe. Ничего не понимаю.
Re: ссылка на remote Stateless EJB и многопоточность
От: Blazkowicz Россия  
Дата: 13.08.10 12:50
Оценка: 3 (1)
Здравствуйте, AlexL_, Вы писали:


AL_>Вопрос: можно ли расшарить эту ссылку на несколько потоков?

На клиенте для Stateless bean это ни на что не влияет. Контейнер все равно будет диспатчить запросы к бину так как ему надо. А надо ему так чтобы обеспечить отсутствие состояния.

AL_>Будет ли это потоко-безопасно? Например, вызываю метод в одном потоке, бин долго работает, в это время вызываю метод и в другом потоке, будет ли создан еще один бин и вызовется ли метод у другого бина?

Не помню точно от чего это зависит. Либо настройки сервера, либо как-то по другому тоже локами управлять можно. Но тут два сценария. Либо сервер создаст второй экземпляр и будет им выполнять запрос. Либо повесит запрос в ожидание.

AL_>Читаю J2ee tutorial 1.4. Написано, что когда мы получаем ссылку на remote, то передаем в метод home.create() параметры, необходимые для создания объекта remote. В моем случае, параметров нет. Получается, что контейнер вроде как не может сам создать объекты, т.к., теоретически, ему надо знать параметры, которые могут быть преданны в ejbCreate(...).

AL_>Но! Дебажу под weblogic 9.2, ставлю брейкпоинт на onEjbCreate(), и он вызывается больше одного раза(а у меня в коде только 1 раз вызывается home.create(), а дальше ссылка просто расшаривается между потоками)! То есть, на практике, всё оказывается thread-safe. Ничего не понимаю.
Пора освежить в памяти спецфикацию... сейчас посмотрим.
Re: ссылка на remote Stateless EJB и многопоточность
От: Blazkowicz Россия  
Дата: 13.08.10 12:58
Оценка: 3 (1)
Здравствуйте, AlexL_, Вы писали:

AL_>Читаю J2ee tutorial 1.4. Написано, что когда мы получаем ссылку на remote, то передаем в метод home.create() параметры, необходимые для создания объекта remote. В моем случае, параметров нет. Получается, что контейнер вроде как не может сам создать объекты, т.к., теоретически, ему надо знать параметры, которые могут быть преданны в ejbCreate(...).

AL_>Но! Дебажу под weblogic 9.2, ставлю брейкпоинт на onEjbCreate(), и он вызывается больше одного раза(а у меня в коде только 1 раз вызывается home.create(), а дальше ссылка просто расшаривается между потоками)! То есть, на практике, всё оказывается thread-safe. Ничего не понимаю.
В спецификации четко сказано. Home.create просто создает ссылку на удаленный интерфейс. А ejbCreate вызывается у каждого экземпляра для того чтобы установить бину параметры из Home.create.
(7.5.5 Session bean’s ejbCreate<METHOD>(...) methods)
Re[2]: ссылка на remote Stateless EJB и многопоточность
От: AlexL_ Россия  
Дата: 13.08.10 14:02
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>(7.5.5 Session bean’s ejbCreate<METHOD>(...) methods)


Большое спасибо! Видимо, он запоминает параметры из home.create(), и при необходимости, создает новый EJB с такими-же параметрами. Почитаю еще спеку. С сайта оракла почему-то скачать не удается, нашел на каком-то левом сайте
Re[3]: ссылка на remote Stateless EJB и многопоточность
От: Blazkowicz Россия  
Дата: 13.08.10 14:07
Оценка:
Здравствуйте, AlexL_, Вы писали:

AL_>Видимо, он запоминает параметры из home.create()

Сериализует.

AL_>С сайта оракла почему-то скачать не удается, нашел на каком-то левом сайте

Да. С таким ораклом к яве скоро пушистый зверь придет.
Re[4]: ссылка на remote Stateless EJB и многопоточность
От: AlexL_ Россия  
Дата: 16.08.10 10:31
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

AL_>>Видимо, он запоминает параметры из home.create()

B>Сериализует.

О, в спецификации написано: The home interface of a stateless session bean must have one create method that takes no arguments. … The session bean class must define a single ejbCreate method that takes no arguments.
Это развеивает мои сомнения по поводу: «как же передаются аргументы при создании бина».

А вот это подтверждает, что вызовы потоко-безопасны: Because all instances of a stateless session bean are equivalent, the container can choose to delegate a client-invoked method to any available instance.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.