我有两个 Java 独立应用程序。我想从一个应用程序发送消息并由两个客户端异步接收消息:一个与发送者在同一个应用程序中。另一个在不同的应用程序中。两者都与 ActiveMQ 代理连接。但我只能看到第一个客户端收到了消息,而另一个没有收到消息。通过 JMS 连接两个应用程序的一般方法是什么?我想我对 JMS 一定有一些不清楚的概念。我四处张望,但不知道如何设置我的 Spring bean 配置文件以在两个 Java 应用程序之间发布/订阅消息。
这是我在第一个应用程序中的发送者的 bean 配置文件,也是同一个应用程序中的第一个侦听器的 bean:
<bean id="customerMessageSender" class="com.example.message.CustomerStatusSender">
<property name="jmsTemplate" ref="jsmTemplateBean" />
<property name="topic" ref="topicBean" />
</bean>
<bean id="jsmTemplateBean" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactoryBean"/>
<property name="pubSubDomain" value="true"/>
</bean>
<bean id="topicBean" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="CustomerStatusTopic" />
</bean>
<bean id="connectionFactoryBean" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616" />
</bean>
<bean id="customerStatusListener" class="com.example.message.CustomerStatusListener" />
<bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactoryBean" />
<property name="destination" ref="topicBean" />
<property name="messageListener" ref="customerStatusListener" />
</bean>
这是位于不同应用程序中的第二个侦听器的 bean 配置文件:
<bean id="topicBean" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="CustomerStatusTopic" />
</bean>
<bean id="connectionFactoryBean" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616" />
</bean>
<bean id="anotherCustomerStatusListener" class="com.mydomain.jms.CustomerStatusMessageListener" />
<bean id="listenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactoryBean" />
<property name="destination" ref="topicBean" />
<property name="messageListener" ref="anotherCustomerStatusListener" />
</bean>
如您所见,customerStatusListener
bean 和anotherCustomerStatusListener
bean 都订阅topicBean
. 但是只有第一个侦听器会收到消息,因为它与发送者在同一个应用程序中,而第二个侦听器没有。通过 JMS 连接两个 Java 应用程序以便可以在两个单独的应用程序之间发送/接收消息的一般原则是什么?
编辑:我无法在第一个 XML 文件中添加以下侦听器 bean,因为该类CustomerStatusMessageListener
位于不同的应用程序中,因此在第一个(发送者的)应用程序的类路径中不可见。
<bean id="anotherCustomerStatusListener" class="com.mydomain.jms.CustomerStatusMessageListener" />
再次编辑:以下是第二个应用程序中的第二个侦听器,它与第一个应用程序分开。它包含一个main
实例化监听器 bean 的方法(jms-beans.xml 是上面列出的第二个监听器的 bean 配置文件)。
public class CustomerStatusMessageListener implements MessageListener {
public void onMessage(Message message) {
if (message instanceof TextMessage) {
try {
System.out.println("Subscriber 2 got you! The message is: "
+ ((TextMessage) message).getText());
} catch (JMSException ex) {
throw new RuntimeException(ex);
}
} else {
throw new IllegalArgumentException(
"Message must be of type TextMessage");
}
}
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("jms-beans.xml");
CustomerStatusMessageListener messageListener = (CustomerStatusMessageListener) context.getBean("anotherCustomerStatusListener");
context.close();
}
}