在jms主题上将最后发送的消息发送给新的消费者

时间:2014-02-26 08:59:47

标签: jms activemq

是否可以将主题配置为仅存储最后一条消息的副本,并在不知道客户端标识符或其他信息的情况下将其发送到新连接?

更新 根据Shashi提供的信息,我发现这两页用户retroactive consumersubscription recovery policy描述了一个类似于我的用例(应用于股票价格)。我怎么没有得到理想的行为。我目前所做的是:

在activemq中包含topic=">"

的policyEntry中的以下行
<subscriptionRecoveryPolicy>
  <fixedCountSubscriptionRecoveryPolicy maximumSize="1"/> 
</subscriptionRecoveryPolicy>

添加到用于连接brocker的URL(使用activemq-cpp)consumer.retroactive=true

设置消费者有耐用性。 (但我强烈认为这不是想要的,因为我只需要最后一个,但没有它我第二次启动消费者时没有得到任何消息)

  1. 启动经纪人。

  2. 启动消费者。

  3. 使用activemq Web管理控制台向主题发送消息。 (我按照预期在消费者中收到)

  4. 停止消费者。

  5. 向该主题发送另一条消息。

  6. 启动消费者。我也收到了消息,也是预期的。

  7. 但是,如果消费者收到消息,那么它会脱机(停止进程)然后重新启动它,它不会收到最后一条消息。

    目标是每当消费者开始获取最后一条消息时,不管是什么(显然,除非没有向主题发送消息)。

    关于我缺少的任何想法?

    背景

    我有一个设备,可以在数据发生变化时将其数据发布到主题。可变数量的消费者可以连接到该主题,从0到小于10.主题中只有一个发布者并且总是将他的所有数据作为单个消息发布(小数据,只是传感器的几个字段)读)。当某些内容发生变化时,此新信息的发布率是可变的,不一定是基于时间的。 问题是当新的消费者连接到主题时,它没有设备读数的数据,直到设备向主题发送新消息。这可以通过创建一个额外的队列来解决,这样新的连接就可以订阅该主题,然后请求设备通过队列进行当前读取(设备将使用队列消息,这将是对数据的请求,然后在相同的队列)。 但由于发送到主题的消息总是信息完整,我想知道是否可以将主题配置为仅存储最后一条消息的副本并将其发送到新连接而不知道客户端标识符或其他信息?

    正在使用的当前经纪人是ActiveMQ。

2 个答案:

答案 0 :(得分:1)

消息传递提供程序(例如WebSphere MQ)具有名为Retained Publication的功能。通过此功能,消息提供程序将保留有关某个主题的上次发布消息,并将其传递给在给定主题上发布消息后进入的新消费者。

Active MQ在其本机接口中可能支持

Retained Publication。此link讨论consumer.retroactive仅适用于OpenWire。

发布者将通过在发布之前在邮件上设置属性来告知邮件提供程序保留发布。以下是使用WebSphere MQ完成的工作方式。

// set as a retained publication
msg.setIntProperty(JmsConstants.JMS_IBM_RETAIN, JmsConstants.RETAIN_PUBLICATION)

答案 1 :(得分:1)

您想拥有retroactive consumers并在主题上设置lastImageSubscriptionRecoveryPolicy subscription recovery policy。 Shashi说的是,将消费者设置为追溯的以下语法仅适用于Openwire

topic = new ActiveMQTopic("TEST.Topic?consumer.retroactive=true");

在您的情况下,您可以做的是使用alwaysRetroactive="true"将所有使用者配置为在代理配置中追溯。我测试过,这对于AMQP协议(库qpid-jms-client)也有效,我怀疑它适用于所有协议。

<destinationPolicy>
  <policyMap>
    <policyEntries>
      <policyEntry topic="FOO.>" alwaysRetroactive="true">
        <subscriptionRecoveryPolicy>
          <lastImageSubscriptionRecoveryPolicy />
        </subscriptionRecoveryPolicy>
      </policyEntry>

配置示例取自https://github.com/apache/activemq/blob/master/activemq-unit-tests/src/test/resources/org/apache/activemq/test/retroactive/activemq-message-query.xml