java - Spring JMS(ActiveMQ)延迟传递消息

标签 java spring jms activemq spring-jms

我们正在尝试为某些 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/

相关文章:

在 Tomcat 8 上启动 Spring 应用程序时出现 java.lang.IllegalAccessError

java - 找不到javax.annotation :com. springsource.javax.annotation :jar:1. 0.0 失败

java - 使用 JMSAppender log4j2 每秒发送 2000 条消息

java - 用于 Tomcat 6 的 JMS

Java ImageIO.write() 最多需要 6 秒

java - 文件处理问题

spring - jpa :repositories tag?的Java配置版本是多少

Java - 打印出数组中出现次数最少的元素

java - 凯撒加密完全丢失空格

java - 如何在代码中创建 Apache Artemis 队列并将它们与 JMS 一起使用?