【问题标题】:ActiveMQ message lost when receiver is not available接收方不可用时 ActiveMQ 消息丢失
【发布时间】:2020-03-24 03:57:51
【问题描述】:

我正在使用 activeMQ 进行消息传递。当发送者和接收者都可用时,我成功收到了消息。但是当我关闭接收器并重新开始时,排队的消息不会再次接收到接收器。我需要做任何配置吗? 我已经增加了如下的生存时间以避免会话过期。

这就是我的发件人代码的样子。

Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createTopic(topic);
MessageProducer producer = session.createProducer(destination);
producer.setTimeToLive(18000000L);
TextMessage message = session.createTextMessage(customMessage.getContent());
producer.send(message);

【问题讨论】:

    标签: java activemq messaging receiver subscriber


    【解决方案1】:

    您观察到的是预期的行为。由于您将消息发送到 JMS topic,因此您将受到发布/订阅语义的影响。发布/订阅语义规定消息仅放置在有效订阅中。当您的订阅者离线时,它在代理上没有有效订阅来接收消息,因此它将错过离线时发送给它的消息。

    您可以使用 durable 订阅者在订阅者离线时接收消息,也可以使用传统的 JMS 队列

    【讨论】:

    • 基于“consumer.dispatchAsync=true/false”会有影响吗?
    • 没有。 consumer.dispatchAsync 的值不会影响发布/订阅语义。
    • 我检查了一些关于持久订阅者的示例。但在这种情况下,订阅者应该检查“Message message = messageConsumer.receive(timeout);”为了接收消息。但我正在寻找订阅者在启动时自动收到消息的位置。
    • 要更好地理解 JMS,您应该阅读 JavaDoc API 文档或规范。任何javax.jms.MessageConsumer 都可以使用setListener() 方法设置javax.jms.MessageListener 来自动异步接收消息。您不必一定要在MessageConsumer 上致电receive()
    • 我已尝试关注devglan.com/spring-boot/spring-boot-jms-activemq-example。当我再次启动应用程序时,Listener 没有收到丢失的消息。我应该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2016-03-27
    • 2021-11-22
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多