在 server.xml 中为安慰资源适配器配置 jmsConnectionFactory 不起作用
Configuring the jmsConnectionFactory in server.xml for solace resource adapter doesn't work
我正在尝试使用 ejb2 和 solace 资源适配器将 solace 与 web sphere liberty 20 版本集成。我在监听队列的 ejb 中配置了 MDB bean。我能够在 MDB 上获取消息,但在处理时我需要将响应发布回队列,并且此队列名称是基于来自上游系统的消息的动态名称。所以我不能将发布者配置为容器中的无状态 bean。
现在我想在 server.xml 中为使用 solace 资源适配器的 MDB 配置的发布者代码中使用连接工厂。
下面的方法我试过了
在server.xml中:
<featureManager>
<feature>javaee-8.0</feature>
<feature>localConnector-1.0</feature>
<feature>jndi-1.0</feature>
<feature>wasJmsClient-2.0</feature>
<feature>wasJmsServer-1.0</feature>
<feature>wasJmsSecurity-1.0</feature>
<feature>mdb-3.2</feature>
<feature>servlet-4.0</feature>
<feature>ejb-3.2</feature>
<feature>ejbHome-3.2</feature>
<feature>adminCenter-1.0</feature>
<feature>jca-1.7</feature>
<feature>jms-2.0</feature>
<feature>webProfile-8.0</feature>
<resourceAdapter autoStart="true" id="solace" location="sol-jms-ra-10.10.0.rar">
<properties.solace ConnectionURL="URL" UserName="user1" Password="pwd" MessageVPN="TEST_VPN"/>
</resourceAdapter>
<jmsActivationSpec id="JNDI/LISTENER">
<properties.solace connectionFactoryJndiName="myCF" destination="queue" destinationType="javax.jms.Queue" />
</jmsActivationSpec >
<jmsConnectionFactory id="JNDI/J2C/CF" jndiName="JNDI/J2C/CF">
<properties.solace ConnectionFactoryJndiName="myCF"/>
</jmsConnectionFactory>
并且在我的发布者代码中,如下所示执行 jndi 查找。
Context ctx = new InitialContext();
connectionFactory = (QueueConnectionFactory) ctx.lookup("java:comp/env/JNDI/J2C/CF");
connection = connectionFactory.createQueueConnection();
但出现以下异常
javax.naming.NameNotFoundException: javax.naming.NameNotFoundException: java:comp/env/JNDI/J2C/CF
at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:355)
at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:370)
at org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:149)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
谁能帮我一下。
您需要定义从资源引用名称 java:comp/env/JNDI/J2C/CF
到配置的 jndiName JNDI/J2C/CF
.
的绑定
一个标准的方法是在你的 web 或 ejb 组件中使用 @Resource
注释来查找它(你也可以使用 @Resource
注释注入的值而不是查找)。例如,
@Resource(name = "java:comp/env/JNDI/J2C/CF", lookup = "JNDI/J2C/CF")
QueueConnectionFactory qcf;
您可以用来定义资源引用的另一种方法是在您的 ejb-jar.xml 文件中这样做。例如,
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
version="2.1">
<enterprise-beans>
<message-driven>
<ejb-name>MyMessageDrivenBean</ejb-name>
<ejb-class>org.example.MyMessageDrivenBean</ejb-class>
<messaging-type>javax.jms.MessageListener</messaging-type>
<transaction-type>Bean</transaction-type>
<resource-ref>
<res-ref-name>java:comp/env/JNDI/J2C/CF</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
<lookup-name>JNDI/J2C/CF</lookup-name>
</resource-ref>
</message-driven>
</enterprise-beans>
</ejb-jar>
或
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
version="2.1">
<enterprise-beans>
<session>
<ejb-name>MyStatelessBean</ejb-name>
<ejb-class>org.example.MyStatelessBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
<resource-ref>
<res-ref-name>java:comp/env/JNDI/J2C/CF</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
<lookup-name>JNDI/J2C/CF</lookup-name>
</resource-ref>
</session>
</enterprise-beans>
</ejb-jar>
此外,如果您需要 QueueConnectionFactory,则需要使用 jmsQueueConnectionFactory 配置元素,
<jmsQueueConnectionFactory id="JNDI/J2C/CF" jndiName="JNDI/J2C/CF">
<properties.solace ConnectionFactoryJndiName="myCF"/>
</jmsQueueConnectionFactory>
我正在尝试使用 ejb2 和 solace 资源适配器将 solace 与 web sphere liberty 20 版本集成。我在监听队列的 ejb 中配置了 MDB bean。我能够在 MDB 上获取消息,但在处理时我需要将响应发布回队列,并且此队列名称是基于来自上游系统的消息的动态名称。所以我不能将发布者配置为容器中的无状态 bean。
现在我想在 server.xml 中为使用 solace 资源适配器的 MDB 配置的发布者代码中使用连接工厂。
下面的方法我试过了
在server.xml中:
<featureManager>
<feature>javaee-8.0</feature>
<feature>localConnector-1.0</feature>
<feature>jndi-1.0</feature>
<feature>wasJmsClient-2.0</feature>
<feature>wasJmsServer-1.0</feature>
<feature>wasJmsSecurity-1.0</feature>
<feature>mdb-3.2</feature>
<feature>servlet-4.0</feature>
<feature>ejb-3.2</feature>
<feature>ejbHome-3.2</feature>
<feature>adminCenter-1.0</feature>
<feature>jca-1.7</feature>
<feature>jms-2.0</feature>
<feature>webProfile-8.0</feature>
<resourceAdapter autoStart="true" id="solace" location="sol-jms-ra-10.10.0.rar">
<properties.solace ConnectionURL="URL" UserName="user1" Password="pwd" MessageVPN="TEST_VPN"/>
</resourceAdapter>
<jmsActivationSpec id="JNDI/LISTENER">
<properties.solace connectionFactoryJndiName="myCF" destination="queue" destinationType="javax.jms.Queue" />
</jmsActivationSpec >
<jmsConnectionFactory id="JNDI/J2C/CF" jndiName="JNDI/J2C/CF">
<properties.solace ConnectionFactoryJndiName="myCF"/>
</jmsConnectionFactory>
并且在我的发布者代码中,如下所示执行 jndi 查找。
Context ctx = new InitialContext();
connectionFactory = (QueueConnectionFactory) ctx.lookup("java:comp/env/JNDI/J2C/CF");
connection = connectionFactory.createQueueConnection();
但出现以下异常
javax.naming.NameNotFoundException: javax.naming.NameNotFoundException: java:comp/env/JNDI/J2C/CF
at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:355)
at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:370)
at org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:149)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
谁能帮我一下。
您需要定义从资源引用名称 java:comp/env/JNDI/J2C/CF
到配置的 jndiName JNDI/J2C/CF
.
一个标准的方法是在你的 web 或 ejb 组件中使用 @Resource
注释来查找它(你也可以使用 @Resource
注释注入的值而不是查找)。例如,
@Resource(name = "java:comp/env/JNDI/J2C/CF", lookup = "JNDI/J2C/CF")
QueueConnectionFactory qcf;
您可以用来定义资源引用的另一种方法是在您的 ejb-jar.xml 文件中这样做。例如,
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
version="2.1">
<enterprise-beans>
<message-driven>
<ejb-name>MyMessageDrivenBean</ejb-name>
<ejb-class>org.example.MyMessageDrivenBean</ejb-class>
<messaging-type>javax.jms.MessageListener</messaging-type>
<transaction-type>Bean</transaction-type>
<resource-ref>
<res-ref-name>java:comp/env/JNDI/J2C/CF</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
<lookup-name>JNDI/J2C/CF</lookup-name>
</resource-ref>
</message-driven>
</enterprise-beans>
</ejb-jar>
或
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
version="2.1">
<enterprise-beans>
<session>
<ejb-name>MyStatelessBean</ejb-name>
<ejb-class>org.example.MyStatelessBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
<resource-ref>
<res-ref-name>java:comp/env/JNDI/J2C/CF</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
<lookup-name>JNDI/J2C/CF</lookup-name>
</resource-ref>
</session>
</enterprise-beans>
</ejb-jar>
此外,如果您需要 QueueConnectionFactory,则需要使用 jmsQueueConnectionFactory 配置元素,
<jmsQueueConnectionFactory id="JNDI/J2C/CF" jndiName="JNDI/J2C/CF">
<properties.solace ConnectionFactoryJndiName="myCF"/>
</jmsQueueConnectionFactory>