Spring JMS(ActiveMQ) 消息延迟传递

Aye*_*let 8 java spring activemq-classic jms spring-jms

我们正在尝试对某些 JMS 消息设置延迟,以便消息只会在 x 时间后添加到队列中/由侦听器接收。到目前为止,我们已经尝试了 2 种无效的方法。

1)根据spring文档,我们可以在JMSTemplate上设置交付延迟。这是我们尝试的示例代码:

@Autowired
private JmsTemplate jmsTemplate;

...
long deliveryDelay = ...;
this.jmsTemplate.setDeliveryDelay(deliveryDelay);
this.jmsTemplate.convertAndSend(
                    queue.getName(),
                    event);
...
Run Code Online (Sandbox Code Playgroud)

然而,我们得到以下异常,即使我们的 spring jms 版本是 4.0.5:

java.lang.IllegalStateException: setDeliveryDelay requires JMS 2.0
Run Code Online (Sandbox Code Playgroud)

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;
}
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

有没有人对问题是什么/关于如何实现延迟消息传递的其他想法有任何建议?谢谢!

Tim*_*ish 5

The comments give the answer. By default scheduled message support is disabled. You must enabled it in the broker XML configuration file as mentioned on the documentation page.

An example Broker tag with scheduler support enabled:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">
Run Code Online (Sandbox Code Playgroud)

您当然必须重新启动代理才能使配置更改生效。然后,当您发送消息时,您需要添加 JMS 标头,告诉代理您想要什么类型的延迟。

message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, scheduledDelay);
Run Code Online (Sandbox Code Playgroud)