我想在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