2014-08-27 102 views
0

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

回答

0

現在我們設法找到了解決方案。對於genericra,不可能將MDB重定向到由genericra給出的資源的JNDI名稱。相反,MDB必須引用由.bindings文件定義的隊列名稱(在左側,而不是在右側的遠程名稱)。 幸運的是,我們能夠使.bindings文件適應我們的需求。

現在我們可以使用給予資源爲「正常」使用genericra配置中的代碼是這樣JNDI名稱:

QueueConnectionFactory qcf = (QueueConnectionFactory) ctx.lookup("jms/MyFactory"); 
Queue asyncQueue = (Queue) ctx.lookup("jms/MyQueue"); 

但多邊開發銀行必須使用名稱,如.bindings給出:

@ActivationConfigProperty(propertyName = "DestinationJndiName", propertyValue = "QUEUE_NAME_IN_BINDINGS") 
1

一般的假設是缺少某些東西在JNDI中 - 如何填充JNDI?看起來這是基於您提到的堆棧跟蹤和.bindings文件的文件系統上下文。

值得注意的是,WMQ擁有自己的資源適配器 - 這裏不需要使用通用的適配器。可能是一個探索的途徑?

+0

感謝您指出這一點。可悲的是,我們必須使用genericra。 – SebastianH 2014-09-12 15:41:15