【问题标题】:How to connect an ActiveMQ producer to an OpenMQ JMS broker如何将 ActiveMQ 生产者连接到 OpenMQ JMS 代理
【发布时间】:2013-01-28 02:07:36
【问题描述】:

我正在尝试将文本消息从一个摆动的重型客户端(使用 Apache ActiveMQ 库)发送到一个 glassfish 服务器实例,该实例似乎使用 OpenMQ 作为默认 JMS 提供程序。

下面是我用于客户的基本源代码:

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 框架的初学者

【问题讨论】:

  • 您可以下载并启动 ActiveMQ 代理,然后测试您的客户端代码。如果它以同样的方式失败,你的客户端就坏了,如果它工作,那么你有一个配置问题。
  • 它对客户端和 ActiveMQ 代理都有效。谢谢你的提示。

标签: java jakarta-ee jms activemq openmq


【解决方案1】:

JMS API 定义了一个 java 接口和一个用于消息传递的架构,它没有定义任何特定的有线协议,它可以是一个信鸽,在内存中或任何常见格式(STOMP、OpenWire、AMQP、MQTT)中。

为什么不能在客户端中使用 Open MQ 库?这就是 JMS 的设计方式。您应该只需要从 .jar 文件切换并更改 ConnectionFactory

我认为没有任何理由仅仅为了使用 ActiveMQ JMS 客户端而切换到 ActiveMQ,因为它应该与 Open MQ 客户端几乎相同。虽然还有其他原因需要切换,例如不同的服务器端功能等等,但您没有提到这一点。

也就是说,有一个桥接组件能够通过 STOMP 协议(​​ActiveMQ 支持)公开任何 JMS 服务器。

它被称为Stomp Connect,在OpenMQ页面上有一些rather old instructions如何使用它。

从那里,您应该能够连接指定 STOMP 的 ActiveMQConnection 工厂。但我自己并没有真正尝试过这种组合。

【讨论】:

    【解决方案2】:

    AcitveMQ JMS 客户端只能与 ActiveMQ 服务器通信。使用 OpenMQ JMS 客户端与 OpenMQ 服务器通信。

    【讨论】:

    • 好的。为什么不同的 JMS 提供者不能相互通信?
    • 因为 JMS 不是线路级规范,供应商可以使用他们自己的协议,而且大多数是专有的。
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 2016-12-18
    • 2010-12-14
    • 2015-07-23
    • 2016-02-08
    • 2012-11-23
    • 1970-01-01
    • 2012-05-06
    相关资源
    最近更新 更多