gpt4 book ai didi

java - Jboss客户端向Jboss中的远程hornetq发送消息

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:57 31 4
gpt4 key购买 nike

我有一个在 JBoss (JB_Client) 中运行的客户端,它需要将消息发送到远程 Jboss 服务器 (JB_Server) HornetQ。远程jboss服务器(JB_server)需要将响应消息发送回其HornetQ。因此,JB_Client MDB 正在监听远程 HorentQ 的响应。

我正在为我的客户端和服务器使用Jboss AS6。该系统在本地环境中完美运行,客户端和服务器都在同一个Jboss中。但现在我需要将客户端和服务器分成两台机器。

这是我的测试客户端配置。

        Properties prop = new Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
prop.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
prop.put(Context.PROVIDER_URL, "jnp://localhost:1099");

ictx = new InitialContext(prop);
conFactory = (ConnectionFactory)ictx.lookup("/ConnectionFactory");
qcon = (QueueConnection)conFactory.createConnection();
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

除了定义的队列之外,服务器没有特殊设置。

我需要在服务器和客户端进行哪些配置才能使其工作?

最佳答案

我能够连接到远程服务器并从远程队列获取响应。我的客户端和服务器都运行在两台独立的计算机上,JBossAS [6.1.0.Final“Neo”]。我的客户端是一个简单的网络应用程序(一个 war 文件)

客户端队列发送者类。

private static void prepareContext() {
logger.debug("Loading Context");
try {
Properties prop = new Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
prop.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
prop.put(Context.PROVIDER_URL, "jnp://10.1.4.48:1099");
ictx = new InitialContext(prop);
conFactory = (ConnectionFactory)ictx.lookup("/ConnectionFactory");
qcon = (QueueConnection)conFactory.createConnection();
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
}
catch (NamingException er) {
logger.fatal("Error ", er);
}
catch (JMSException er) {
logger.fatal("Error ", er);
}
}



public static boolean sendToQueue(String xml, String sendQ) {
logger.warn("Sending to queue: " + xml);
try {
prepareContext();
Queue queue = getQueue(sendQ);
if (null == queue) {
throw new JMSException("Queue not defined at the end point");
}
qcon.start();
QueueSender qsender = qsession.createSender(queue);
TextMessage tmsg = qsession.createTextMessage();
tmsg.setText(xml);
qsender.send(tmsg);
return true;
}
catch (JMSException er) {
logger.fatal("Error ", er);
}
finally {
try { qsession.close(); } catch (Exception er) {/**/}
try { qcon.close(); } catch (Exception er) {/**/}
}
return false;
}

以上是客户端发送者代码。

现在让我们看看客户端消息接收器如何。我用过MDB监听远程服务器队列。

public class MessageReceiverBean implements MessageListener {

public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage textMsg = (TextMessage) message;
logger.info("Inside onMessage of client app MessageReceiverBean : " + textMsg.getText());
}
}
catch (Exception er) {
logger.error("Error while retrieving message from Service provider", er);
}
}
}

MDB 配置位于我的 war 文件的 META-INF 文件夹中的 ejb-jar.xml 中。

<message-driven>
<ejb-name>User1</ejb-name>
<ejb-class>com.my.MessageReceiverBean</ejb-class>
<messaging-type>javax.jms.MessageListener</messaging-type>
<transaction-type>Container</transaction-type>
<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/User4</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=10.1.4.48;port=5445</activation-config-property-value>
</activation-config-property>
</activation-config>
</message-driven>

另外添加了最后两个activation-config-properties以连接到远程服务器。这样客户端java编码就结束了。

奖金!!!。上面只是在一个简单的java类中通过JNDI调用它。但您可能有兴趣通过 EJB CDI 注入(inject)来完成此操作,而不使用上下文属性等。为此,您需要在客户端 jboss 端修改以下设置。

我在客户端 Jboss 节点中更改了两个设置。

  1. hornetq-configuration.xml在客户端Jboss节点中。

<connector name="netty">
<factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
<param key="host" value="${MY_IP:10.1.4.48}"/> <!-- For MY_IP you can put any word. Doesn't matter. -->
<param key="port" value="${hornetq.remoting.netty.port:5445}"/>
</connector>

  1. ra.xml文件在 jms-ra.rar (部署文件夹)位于客户端 Jboss 节点中。像这样注释下面的设置。

    <!--<config-property>
    <description>The transport configuration. These values must be in the form of key=val;key=val;,
    if multiple connectors are used then each set must be separated by a comma i.e. host=host1;port=5445,host=host2;port=5446.
    Each set of params maps to the connector classname specified.
    </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>-->

好的。 Jboss设置完毕。现在让我们看看 EJB bean。我们需要通过注解的方式注入(inject)上面的连接。

@Resource(mappedName = "/ConnectionFactory")
private QueueConnectionFactory qConnectionFactory;

如果您检查您的hornetq-jms.xml您可以在 <connection-factory name="NettyConnectionFactory"> 下看到上面的mappedName被定义( <entry name="/ConnectionFactory"/> )。这是您应该在 EJB 中查找的 JNDI 名称,以在远程 HornetQ 服务器中查找 connectionFactory。如果您需要使用 EJB CDI 注入(inject)而不是 JNDI 查找,就是这样。

重新启动客户端jboss,然后您应该能够将消息从客户端发送到服务器。 (启动jboss时无需特殊设置)

如果您转到客户端的 jmx-console 并转到 org.hornetq,您可以验证它连接在哪里。然后点击module=JMS,name="NettyConnectionFactory",type=ConnectionFactory 。在 StaticConnectors您会看到此 NettyConnector 连接的位置。

现在服务器端 Jboss HornetQ 设置。

在服务器Jboss中编辑hornetq-configuration.xml并更改部分。

<acceptor name="netty">
<factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
<param key="host" value="${jboss.esb.bind.address:10.1.4.48}"/> <!-- Here I add the server IP and esb. May be you can remove the esb and use "jboss.bind.address:10.1.4.48" -->
<param key="port" value="${hornetq.remoting.netty.port:5445}"/>
</acceptor>

这是服务器 Jboss 设置。我使用 run.bat -b 10.1.4.48 选项启动服务器。

希望这有帮助。

关于java - Jboss客户端向Jboss中的远程hornetq发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25397138/

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