我正在尝试使用Active MQ覆盖消息来实现延迟队列。
每条消息都计划以x(例如60秒)的延迟传送
如果再次收到相同的消息,它应该覆盖以前的消息。
所以,即使我在x秒内收到10条消息。只应处理一条消息。
有没有干净的方法来实现这个目标?
答案 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;
}
}