ActiveMQ覆盖预定消息

时间:2013-07-24 19:56:21

标签: override message activemq schedule

我正在尝试使用Active MQ覆盖消息来实现延迟队列。

每条消息都计划以x(例如60秒)的延迟传送

如果再次收到相同的消息,它应该覆盖以前的消息。

所以,即使我在x秒内收到10条消息。只应处理一条消息。

有没有干净的方法来实现这个目标?

4 个答案:

答案 0 :(得分:6)

这个问题有两个部分需要单独解决:

可以在ActiveMQ中延迟消息吗?

是 - 请参阅Delay and Schedule Message Delivery。您需要在ActiveMQ配置中设置<broker ... schedulerSupport="true">,并设置JMS消息的AMQ_SCHEDULED_DELAY属性,说明您希望消息延迟多长时间(在您的情况下为10000)。

有没有办法阻止同一消息被多次使用?

是的,但这是一个应用程序问题,而不是ActiveMQ问题。它通常被称为重复数据删除或幂等消费。如果您只有一个消费者,最简单的方法是跟踪地图中收到的消息,并检查该地图是否收到消息。它已被看到,丢弃。

对于在不同计算机上有多个使用者的更复杂用例,或者您希望该状态在应用程序重新启动后仍然存在,您需要保留数据库中显示的消息表,并每次查询它。

如果有帮助,请将此答案投票,因为它鼓励人们帮助您。

答案 1 :(得分:0)

同样根据ActiveMQ BrokerService类的方法,您应该将持久性配置为具有使用调度程序功能的能力。

public boolean isSchedulerSupport() {
    return this.schedulerSupport && (isPersistent() || jobSchedulerStore != null);
}

答案 2 :(得分:0)

您可以配置activemq代理以启用&#34; schedulerSupport&#34;以及位于activemq主目录的conf目录中的activemq.xml文件中的以下条目。

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">

答案 3 :(得分:0)

您可以在配置中覆盖BrokerService

    @Configuration
    @EnableJms
    public class JMSConfiguration {

        @Bean
        public BrokerService brokerService() throws Exception {
            BrokerService brokerService = new BrokerService();
            brokerService.setSchedulerSupport(true);
            return brokerService;
        }
    }