gpt4 book ai didi

java - 从消息驱动 Bean (MDB) 连接到远程 JMS 提供程序

转载 作者:行者123 更新时间:2023-11-30 07:35:25 26 4
gpt4 key购买 nike

从部署在 Glassfish 上的 EJB 或 POJO,我可以使用以下代码连接到 HornetMQ,在我将必要的 hornet 特定 jar 添加到类路径之后:

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”。

基本上我的问题是在使用 MDB 时如何配置 GF 以查找远程服务器(如第一个片段中所示)?

最佳答案

经过更多挖掘,我在 these forums 上找到了解决方案

要使 MDB 能够与远程 HornetQ 提供者“对话”,请执行以下步骤:

  • 部署 hornetq-ra.rar使用管理控制台到 glassfish(你会在 hornetq 文件夹的“libs”文件夹中找到它)
  • 找到<gf_install_dir>/domains/<your_dmain>/applications/hornetq-ra/META-INF/ra.xml并注释掉以下部分:

 <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>

显然要离开 server-id将导致部署时间异常。

  • 将以下 jars 复制到 GF 域 lib 文件夹:hornetq-core-client.jar , hornetq-jms-client.jar , hornetq-logging.jarnetty.jar
  • 为要与 HornetQ (sun-ejb-jar.xml) 一起使用的 MDB 创建一个 xml 描述符:

  <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>
  • 假设您的 MDB 看起来像这样,您应该会收到消息:

@MessageDriven(mappedName = "ExampleMDB")
public class MessageProcessor implements MessageListener {

public MessageProcessor() {
}

public void onMessage(Message message) {

System.out.println("message received");

}
}

关于java - 从消息驱动 Bean (MDB) 连接到远程 JMS 提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4487615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com