【问题标题】:Quarkus ActiveMQ JMSQuarkus ActiveMQ JMS
【发布时间】:2022-12-03 02:40:23
【问题描述】:

我有一个似乎不受 Quarkus 支持的 ActiveMQ 队列。当我尝试使用 here 描述的 Quarkus JMS 实现时,出现以下错误:

AMQP SASL header mismatch value 0, expecting 41. In state: HEADER0 

我假设这是因为 ActiveMQ 服务器不支持 AMQP。我编写的代码尝试连接到 ActiveMQ 服务器。

        ConnectionFactory connectionFactory = new ConnectionFactory();
        connection = connectionFactory.createConnection();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue("inQue");
        producer = session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        messageMap = session.createMapMessage();

虽然以上不起作用。如果我将其更改为使用 来自 ActiveMQ 的 ActiveMQConnectionFactory 它工作得很好:

        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
        connection = connectionFactory.createConnection("admin", "admin");
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue("inQue");
        producer = session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        messageMap = session.createMapMessage();

但是,如果我更改为 ConnectionFactory 的 Quarkus 版本,它就不再有效,并且出现上述错误。那么有可能以某种方式解决这个问题吗?或者我需要使用ActiveMQConnectionFactory吗?如果是这样,我怎样才能让 Quarkus 注册我的MessageListener?现在,为了测试,我写:

      MessageListener listener = new MyListener();
      consumer.setMessageListener(listener);

但我希望 Quarkus 在应用程序启动时执行此操作。但我不确定该怎么做。

【问题讨论】:

  • 您使用的是哪个版本的 ActiveMQ?

标签: java activemq quarkus


【解决方案1】:

根据您使用的 ActiveMQ 版本,您应该能够使用基于 Qpid JMS 并使用 AMQP 的 Quarkus JMS 扩展。诀窍是您需要连接到配置为使用 AMQP 的传输连接器,而不是使用通常驻留在端口 61616 上的本机 Openwire 协议的传输连接器。

ActiveMQ documentation 定义了这是如何完成的。本质上,在您的代理配置中,您需要一个与此类似的定义:

<transportConnectors>
   <transportConnector name="amqp" uri="amqp://0.0.0.0:5672"/>
</transportConnectors>

当然,如果使用 ActiveMQ Artemis,此配置会有所不同,但您没有指定正在运行的 ActiveMQ 的特定版本。

您提供的错误消息(如果它来自服务器日志)表明客户端确实连接到 AMQP 端点,但它得到了它没有预料到的东西,这意味着发生了其他奇怪的事情,例如您没有使用 Qpid JMS但是一些其他客户端因为预期的 AMQP 标头的初始字节被报告为零,这肯定是错误的,因为 AMQP 标头总是以字母“A”开头。

【讨论】:

  • 谢谢你,蒂姆。我尝试了您的解决方案并收到以下错误 java.io.IOException: Transport Connector could not be registered in JMX: java.io.IOException: Transport scheme NOT recognized: 来自服务器的 [amqp]。我有权访问 activemq.xml 文件,但无权访问运行 activeMQ 实例的服务器代码。有没有办法从配置文件中找出版本?
  • 嗯,在查看了一些日志后,它似乎是运行 5.2 的相当旧版本的 activemq。所以我猜 amqp 不起作用
  • 5.2 太旧了,应该尽快升级。对于版本那么旧的 JMS 2.0 API,您没有任何选择。
猜你喜欢
  • 2015-12-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2011-05-03
  • 2018-10-10
  • 2019-01-03
  • 2014-08-23
相关资源
最近更新 更多