我正试图将文本消息从一个swing重型客户端(使用Apache ActiveMQ库)发送到一个似乎使用OpenMQ作为默认JMS提供程序的glassfish服务器实例。
下面是我为客户使用的基本源代码:
try {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("jms/SaisieQueueFactory");
connectionFactory.setBrokerURL("tcp://localhost:27676");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("jms/SaisieQueue");
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
TextMessage message = session.createTextMessage("Score + 1");
producer.send(message);
session.close();
connection.close();
} catch(Exception ex) {
ex.printStackTrace();
}
- 我在Glassfish服务器的管理控制台(JMS_PROVIDER_port)的系统属性中找到了代理端口
- 队列连接工厂和队列是在我部署MessageDrivenBean时创建的
- 目前,客户端和glassfish实例在同一台计算机上运行,但我希望它们在两台不同的机器上工作(这就是为什么我不使用vm://作为传输协议)
我得到了这些例外:
javax.jms.JMSException: Cannot send, channel has already failed: tcp://127.0.0.1:7676
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:62)
at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1395)
at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1481)
at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:516)
at testdate.TestDate.main(TestDate.java:44)
Caused by: org.apache.activemq.transport.InactivityIOException: Cannot send, channel has already failed: tcp://127.0.0.1:7676
at org.apache.activemq.transport.AbstractInactivityMonitor.doOnewaySend(AbstractInactivityMonitor.java:282)
at org.apache.activemq.transport.AbstractInactivityMonitor.oneway(AbstractInactivityMonitor.java:271)
at org.apache.activemq.transport.TransportFilter.oneway(TransportFilter.java:85)
at org.apache.activemq.transport.WireFormatNegotiator.oneway(WireFormatNegotiator.java:104)
at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:68)
at org.apache.activemq.transport.ResponseCorrelator.asyncRequest(ResponseCorrelator.java:81)
at org.apache.activemq.transport.ResponseCorrelator.request(ResponseCorrelator.java:86)
at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1366)
... 3 more
- 我考虑过将Glassfish实例的JMS提供程序更改为ActiveMQ的解决方案,但如果可能的话,我希望保留OpenMQ
PS:我是JMS和Java EE框架的初学者
JMS API定义了java接口和消息传递体系结构,它没有定义任何特定的有线协议,它可以是信鸽、内存或任何常见格式(STOMP、OpenWire、AMQP、MQTT)。
为什么不能在客户端中使用Open MQ库?JMS就是这样设计的。您只需要从.jar文件切换并更改ConnectionFactory
。
我认为没有任何理由仅仅为了使用ActiveMQ JMS客户端而切换到ActiveMQ,因为它应该与Open MQ客户端基本相同。不过,切换还有其他原因,比如不同的服务器端功能等等,但您没有提到这一点。
也就是说,有一个桥接组件能够通过STOMP协议(ActiveMQ支持)公开任何JMS服务器。
它被称为StompConnect,在OpenMQ页面上有一些相当古老的使用说明
从那里,您应该能够连接到指定STOMP的ActiveMQConnection工厂。但我自己并没有真正尝试过这种组合。
AcitveMQ JMS客户端只能与ActiveMQ服务器对话。使用OpenMQ JMS客户端与OpenMQ服务器进行对话。