【发布时间】:2014-09-27 01:39:47
【问题描述】:
我们正在尝试对一些 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>
是否有人对问题是什么/有关如何实现延迟消息传递的其他想法有任何建议? 谢谢!
【问题讨论】:
-
您的第一种方法仅适用于符合 JMS 2.0 的 JMS 代理,ActiveMQ 不是(目前)其中之一。仅当您还在 JMS 代理端启用了调度时,第二个选项才会起作用,否则该属性将不执行任何操作。
-
谢谢@M.Deinum。我在 activemq.xml 中设置了 schedulerSupport="true",现在它可以工作了。
-
延迟消息存储在客户端?
标签: java spring jms activemq spring-jms