Java 从消息驱动Bean(MDB)连接到远程JMS提供程序
从部署在Glassfish上的EJB或POJO,在向类路径添加必要的特定于hornet的JAR后,我可以使用以下代码连接到HornetMQ:Java 从消息驱动Bean(MDB)连接到远程JMS提供程序,java,jakarta-ee,jms,glassfish-3,Java,Jakarta Ee,Jms,Glassfish 3,从部署在Glassfish上的EJB或POJO,在向类路径添加必要的特定于hornet的JAR后,我可以使用以下代码连接到HornetMQ: Properties properties = new Properties(); properties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); // server name properties.put("java.namin
Properties properties = new Properties();
properties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
// server name
properties.put("java.naming.provider.url", "jnp://hostname:1099");
properties.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
InitialContext initialContext = new InitialContext(properties);
// queue name
Queue queue = (Queue)initialContext.lookup("/queue/exampleQueue");
// connection factory
ConnectionFactory connectionFactory = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
Connection conn = connectionFactory.createConnection();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
conn.start();
// ...
但是我想从消息驱动Bean中执行同样的操作
对于MDB,如果我使用嵌入式Glassfish提供程序,它将非常容易;但是如何配置GF以使用远程提供程序
有什么想法吗?谢谢大家!
编辑:使事情更清楚一点;典型的MDB如下所示:
@MessageDriven(mappedName = "/queue/exampleQueue", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class MessageProcessor implements MessageListener {
public MessageProcessor() {
}
public void onMessage(Message message) {
}
}
但是在这种情况下,MDB将在本地服务器而不是远程服务器上查找“/queue/exampleQueue”
基本上,我的问题是如何配置GF以在使用MDB时查找远程服务器(如第一个代码段中所示) 您正在尝试配置远程JMS提供程序。这里有一篇好文章
但是,我不确定它是否适用于HornetMQ,在我找到解决方案后,您可能需要使用OpenMQ的远程实例 要使MDB能够与远程HornetQ提供商“对话”,请执行以下步骤:
- 使用管理控制台将hornetq ra.rar部署到glassfish(您可以在hornetq文件夹的“libs”文件夹中找到它)
- 查找
,并注释掉以下部分:/domains//applications/hornetq-ra/META-INF/ra.xml
- 假设您的MDB看起来像这样,您应该会收到以下消息:
@普雷斯顿,见我的更新。链接+1;恐怕这篇文章是针对GF2.1的;GF 3.0.1在连接工厂的底部似乎没有任何通用资源适配器版本3没有附加属性部分?这就是您要配置地址列表的地方。“如果我们使用的是远程JMS代理,那么我们应该添加一个新的属性AddressList,并将该值设置为主机:端口组合的逗号分隔列表。”
<config-property>
<description>The transport configuration. These values must be in the form of key=val;key=val;</description>
<config-property-name>ConnectionParameters</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>server-id=0</config-property-value>
</config-property>
<ejb-name>MessageProcessor</ejb-name> <!-- MDB class name -->
<jndi-name>ExampleMDB</jndi-name>
<mdb-resource-adapter>
<!-- The resource adapter mid element ties the generic ra for JMS
with this particular MDB -->
<resource-adapter-mid>hornetq-ra</resource-adapter-mid>
<activation-config>
<activation-config-property>
<activation-config-property-name>destinationType</activation-config-property-name>
<activation-config-property-value>javax.jms.Queue</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>destination</activation-config-property-name>
<activation-config-property-value>/queue/exampleQueue</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>ConnectorClassName</activation-config-property-name>
<activation-config-property-value>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>ConnectionParameters</activation-config-property-name>
<activation-config-property-value>host=hostname;port=5445</activation-config-property-value>
</activation-config-property>
<!--
<activation-config-property>
<activation-config-property-name>UserName</activation-config-property-name>
<activation-config-property-value>user</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>Password</activation-config-property-name>
<activation-config-property-value>pass</activation-config-property-value>
</activation-config-property>
-->
</activation-config>
</mdb-resource-adapter>
</ejb>
@MessageDriven(mappedName = "ExampleMDB")
public class MessageProcessor implements MessageListener {
public MessageProcessor() {
}
public void onMessage(Message message) {
System.out.println("message received");
}
}