У меня есть несколько потоков, которым нужен 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 и многопоточность
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 и многопоточность
Здравствуйте, 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 и многопоточность
Здравствуйте, Blazkowicz, Вы писали:
B>(7.5.5 Session bean’s ejbCreate<METHOD>(...) methods)
Большое спасибо! Видимо, он запоминает параметры из home.create(), и при необходимости, создает новый EJB с такими-же параметрами. Почитаю еще спеку. С сайта оракла почему-то скачать не удается, нашел на каком-то левом сайте
Re[3]: ссылка на remote Stateless EJB и многопоточность
Здравствуйте, AlexL_, Вы писали:
AL_>Видимо, он запоминает параметры из home.create()
Сериализует.
AL_>С сайта оракла почему-то скачать не удается, нашел на каком-то левом сайте
Да. С таким ораклом к яве скоро пушистый зверь придет.
Re[4]: ссылка на remote Stateless EJB и многопоточность
Здравствуйте, 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.