ActiveMQ 消息未在第二个消费者中接收

Posted

技术标签:

【中文标题】ActiveMQ 消息未在第二个消费者中接收【英文标题】:ActiveMQ messages not receive in second consumer 【发布时间】:2018-08-22 00:06:56 【问题描述】:

我已经使用JavaStomp.js 实现了ActiveMQ-Pub/Sub 程序。只有一个生产者写在Java,消费者写在js

这是问题场景,

生产者保持向主题发布消息。 消费者A连接和订阅同一个主题。 消费者B 连接并订阅同一个主题。 现在AB同时监听同一个topic,但是A收到的数据和B收到的数据不一样,B会跳过一些数据。 当我断开A 时,B 工作正常。 当我断开B 时,A 工作正常。

这里是生产者代码

public static Session SESSION;

/**
 *
 * @return @throws JMSException
 */
public static Session getSessionInstance() throws JMSException, IOException 
    if (null == SESSION) 
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(Context.getSystemProperties().getAmp().getUrl());
        Connection connection = connectionFactory.createConnection();
        connectionFactory.getPrefetchPolicy().setAll(1);
        connection.start();

        SESSION = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    
    return SESSION;


/**
 *
 * @param message
 * @throws JMSException
 */
public static void sendMessage(String topic, String message) throws JMSException, IOException 
    Session session = getSessionInstance();
    Destination destination = session.createQueue(topic);
    MessageProducer producer = session.createProducer(destination);
    producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

    TextMessage txtMessage = session.createTextMessage(message);
    producer.send(txtMessage);

    producer.close();

和消费者

var client = Stomp.client("ws://localhost:61614?consumer.prefetchSize=1", "v11.stomp");
client.debug = null;
var selectedVehicleImei = 741852963123456;
client.connect("", "", function (topic) 
    client.subscribe("COO." + selectedVehicleImei, function (message) 
        var infodata = JSON.parse(message.body);
        console.log(infodata);
    )
)

我尝试将 pre-fetch 值设置为, 在制片人中,

connectionFactory.getPrefetchPolicy().setAll(1);

在消费者中,

?consumer.prefetchSize=1

但仍然没有运气,这里有什么问题,谁能告诉我如何才能完成这项工作?

【问题讨论】:

【参考方案1】:

我认为您需要使用 createTopic 而不是 CreateQueue。即使您调用了变量主题,它看起来也是一个队列。

队列用于只需要由一个消费者回答的任务(例如发送电子邮件)。

【讨论】:

有一个问题,消费者没有得到任何回应和ActiveMQ admin 显示,我认为两个主题,例如COO.355227044952539ActiveMQ.Advisory.Producer.Topic.COO.355227044952539 这可能吗? 是您之前创建的目的地之一吗? (队列) 另外,还有一个与主题同名的队列,COO.355227044952539 js 代码有些问题,当我尝试订阅另一个新主题时,它会创建一个显示在admin 控制台中的队列 我想知道像client.subscribe("/topic/COO." + selectedVehicleImei, function (message) 这样的东西是否可行。文档说要在开始时输入/queue//topic/,但如果你什么都不放,它可能会退回到/queue/

以上是关于ActiveMQ 消息未在第二个消费者中接收的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ---ActiveMQ原理分析之消息消费

ActiveMQ的两种消息模式,主题队列

ActiveMQ消息签收机制

ActiveMQ入门介绍

如何将消息从 Activemq 推送到消费者

activemq总结