Клиент приложения JMS может создавать более одного активного сеанса, в то время как веб-компоненты / ejb не могут?

#jakarta-ee #jms #ejb #java-ee-5

#jakarta-ee #jms #ejb #java-ee-5

Вопрос:

Я читаю руководство JEE5 по JMS.

И мне трудно понять причину этого «общего правила«:

Общее правило в спецификации платформы Java EE применяется ко всем компонентам Java EE, которые используют JMS API в EJB или веб-контейнерах:

Компоненты приложения в контейнерах web и EJB не должны пытаться создать более одного активного (не закрытого) объекта сеанса для каждого соединения.

Это правило не применяется к клиентам приложений.

Почему это не применяется к клиентам приложений, а применяется к веб-компонентам / EJB.?

Ответ №1:

Существует довольно много правил, касающихся JMS, которые отличаются при использовании его из автономного клиента и из среды Java EE. Единственное, что приходит на ум, — это возможность создания прослушивателя JMS.

И старая (но все еще актуальная цитата из спецификации 1.3):

 ... Note that the JMS API creates threads to deliver messages to 
message listeners. The use of this message listener facility may be 
limited by the restrictions on the use of threads in various 
containers. In EJB containers, for instance, it is typically not 
possible to create threads. The following methods must not be used by 
application components executing in containers that prevent them 
from creating threads: 
. 
- javax.jms.Session method setMessageListener 
- javax.jms.Session method getMessageListener 
- javax.jms.Session method run 
- javax.jms.QueueConnection method createConnectionConsumer 
- javax.jms.TopicConnection method createConnectionConsumer 
- javax.jms.TopicConnection method createDurableConnectionConsumer 
- javax.jms.MessageConsumer method getMessageListener 
- javax.jms.MessageConsumer method setMessageListener 
. 
In addition, use of the following methods on javax.jms.Connection
objects by applications in Web and EJB containers may interfere with the
connection management functions of the container and must not be used:
- setExceptionListener 
- stop
- setClientID 
A J2EE container may throw a JMSException if the application component 
violates these restrictions. ....
  

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

Обратите внимание, что новая версия JMS 2.0 для Java EE 7 имеет лучшее и более четкое соответствие между базовой спецификацией JMS и Java EE в качестве одной из своих целей. Смотрите здесь: http://jcp.org/en/jsr/detail?id=343