我们正在尝试为某些 JMS 消息设置延迟,以便消息只会在 x 时间后添加到队列/由监听器接收。到目前为止,我们已经尝试了 2 种无效的方法。
1)根据spring文档,我们可以在JMSTemplate上设置delivery delay。这是我们尝试的示例代码:
@Autowired
private JmsTemplate jmsTemplate;
...
long deliveryDelay = ...;
this.jmsTemplate.setDeliveryDelay(deliveryDelay);
this.jmsTemplate.convertAndSend(
queue.getName(),
event);
...
但是,即使我们的 spring jms 版本是 4.0.5,我们也会得到以下异常:
java.lang.IllegalStateException: setDeliveryDelay requires JMS 2.0
2) 我们也尝试过在消息本身上设置延迟,但看起来延迟被忽略了,消息还是立即传递了。
@Component
public class MyMessageConverter implements MessageConverter {
...
@Override
public Message toMessage(Object eventObject, Session session) throws JMSException, MessageConversionException {
...
long deliveryDelay = ...;
objectMessage.setLongProperty(
ScheduledMessage.AMQ_SCHEDULED_DELAY,
deliveryDelay);
return objectMessage;
}
}
spring xml中的jmsTemplate定义:
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="cachingConnectionFactory" />
<property name="messageConverter" ref="myMessageConverter" />
<property name="sessionTransacted" value="true" />
</bean>
有没有人对问题是什么有任何建议/关于如何实现延迟消息传递的其他想法? 谢谢!
最佳答案
评论给出了答案。默认情况下禁用计划消息支持。您必须按照 documentation 中所述在代理 XML 配置文件中启用它页面。
启用了调度程序支持的 Broker 标记示例:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">
当然,您必须重新启动代理才能使配置更改生效。然后,当您发送消息时,您需要添加 JMS header ,告诉代理您想要什么类型的延迟。
message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, scheduledDelay);
关于java - Spring JMS(ActiveMQ)延迟传递消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25121094/