我想在Glassfish 3.1.2中配置一個MDB來監聽遠程JMS隊列(MQ 7通過GenericJMSRA 2.0.1)。GlassFish上的MDB監聽遠程JMS隊列(MQ通過GenericJMSRA)
當我嘗試使用JNDI名稱來定義我的MDB這樣
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "DestinationJndiName", propertyValue = "jms/MyQueue"),
@ActivationConfigProperty(propertyName = "ConnectionFactoryJndiName", propertyValue = "jms/MyFactory") })
@TransactionManagement(TransactionManagementType.BEAN)
public class SimpleMdb implements MessageListener { ... }
我得到這個錯誤(從堆棧跟蹤最小的提取物):如果我使用的名稱
java.lang.RuntimeException: EJB Container initialization error
at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:242)
Caused by: java.lang.Exception
at com.sun.enterprise.connectors.inbound.ConnectorMessageBeanClient.setup(ConnectorMessageBeanClient.java:233)
Caused by: javax.resource.spi.InvalidPropertyException: MyFactory
at com.sun.genericra.util.ExceptionUtils.newInvalidPropertyException(ExceptionUtils.java:42)
Caused by: javax.naming.NameNotFoundException: MyFactory
at com.sun.jndi.fscontext.RefFSContext.getObjectFromBindings(RefFSContext.java:400)
在.bindings文件和資源適配器定義中定義的Factory和Queue如下所示,它工作正常。
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "DestinationJndiName", propertyValue = "SOME.REALLY.UGLY.LONG.NAME"),
@ActivationConfigProperty(propertyName = "ConnectionFactoryJndiName", propertyValue = "THE_NAME_OF_THE_FACTORY") })
@TransactionManagement(TransactionManagementType.BEAN)
public class SimpleMdb implements MessageListener { ... }
當我只能用「醜陋」來替換工廠的JNDI名稱,我會得到相同的堆棧跟蹤同上,但指的是「myQueue中」。
同時我的.bindings文件的設置,domain.xml中的資源適配器定義(通過工具插入)以及EJBs/Servlet中的隊列使用情況似乎沒有問題。 我可以使用隊列和連接工廠在平時的所期望的方式 - 這工作得很好:
QueueConnectionFactory qcf = (QueueConnectionFactory) ctx.lookup("jms/MyFactory");
Queue asyncQueue = (Queue) ctx.lookup("jms/MyQueue");
有人可以提供關於爲什麼發生這種情況的洞察力?我想在代碼中的任何地方使用JNDI名稱,例如「jms/MyQueue」 - 包括MDB定義。
這裏是我的domain.xml中的相關章節:
<resource-adapter-config thread-pool-ids="genericra-thread-pool" resource-adapter-name="genericra">
<property name="SupportsXA" value="false"></property>
<property name="ProviderIntegrationMode" value="jndi"></property>
<property name="RMPolicy" value="OnePerPhysicalConnection"></property>
<property name="LogLevel" value="FINEST"></property>
<property name="JndiProperties" value="..."></property>
</resource-adapter-config>
<connector-connection-pool name="genericra-pool-1" resource-adapter-name="genericra" is-connection-validation-required="true" connection-definition-name="javax.jms.QueueConnectionFactory" fail-all-connections="true" transaction-support="NoTransaction">
<property name="ConnectionFactoryJndiName" value="THE_NAME_OF_THE_FACTORY"></property>
</connector-connection-pool>
<connector-resource pool-name="genericra-pool-1" jndi-name="jms/MyFactory"></connector-resource>
<admin-object-resource res-adapter="genericra" res-type="javax.jms.Queue" jndi-name="jms/MyQueue">
<property name="DestinationJndiName" value="SOME.REALLY.UGLY.LONG.NAME"></property>
<property name="Name" value="jms/MyQueue"></property>
</admin-object-resource>
- 的GlassFish 3.1.2.9
- 的WebSphere MQ 7
- genericra 2.0.1
- 的Java 1.7/JEE 6/EJB 3.1
感謝您指出這一點。可悲的是,我們必須使用genericra。 – SebastianH 2014-09-12 15:41:15