Spring Boot中的ActiveMQ延迟消息投递

4
我的问题与Spring JMS(ActiveMQ)延迟传递消息非常相似,但更相关于spring-boot自动配置程序。
我正在尝试使用jmsTemplate.setDeliveryDelay方法,但它抛出一个java.lang.IllegalStateException: setDeliveryDelay requires JMS 2.0异常。
我试图从http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html找到正确的属性,但找不到代理调度器支持选项。
目前,我的application.properties文件为空,并且我的JmsListenerContainerFactory定义如下。
@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
                                                DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();

    configurer.configure(factory, connectionFactory);
    return factory;
}

我的pom文件只包含

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-activemq</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

使用1.4.1.RELEASE中的spring-boot-starter-parent。

问题是:是否可以使用SpringBoot配置将schedulerSupport设置为true?

如果需要,这是我的发送器(Sender):

public void send(String message) {
    System.out.println("Im sending this message " + message);
    jmsTemplate.setDeliveryDelay(5000);
    jmsTemplate.convertAndSend(Beans.QUEUE_NAME, message);
}

和接收方

@JmsListener(destination = Beans.QUEUE_NAME, containerFactory = "myFactory")
public void receiveMessage(String message) {
    System.out.println("Received this message <" + message + ">");
}

谢谢您的提前帮助。


更新:我尝试将其放入消息属性中,就像文档http://activemq.apache.org/delay-and-schedule-message-delivery.html所述,但它没有起作用。

@Bean
public MessageConverter messageConverter() {
    MessageConverter converter = new MessageConverter(){
        @Override
        public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
            if (!(object instanceof MyPojo)) {
                throw new MessageConversionException("not agreed Pojo!");
            }
            MyPojo pojo = (MyPojo) object;

            Message message = session.createTextMessage(pojo.getMessage());
            message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, pojo.getScheduledWait());
            return message;
        }
        @Override
        public Object fromMessage(Message message) throws JMSException, MessageConversionException {
            return message;
        }
    };
    return converter;
}

你解决了这个问题吗? - Mikhail
我在下面回答了自己的问题(是第二个)。最后我使用了另一个启动器(Artemis)。 - Allan Vital
2个回答

2

2
该模板尝试调用JMS 2.0交付延迟方法,但ActiveMQ客户端和代理仅支持JMS 1.1,因此您将收到此错误。您可以使用在消息中设置属性的方式来使用ActiveMQ支持的计划交付,该属性值定义在这里
目前还不清楚如何在Spring Boot中启用调度程序,但我猜想您需要提供自己的Broker URI以启用它,类似于:
broker:(tcp://localhost:61616)?persistent=true&useJmx=false&schedulerSupport=true

谢谢您提供的建议。我已更新MessageConverter以使用Activemq属性,但它仍无法调度,消息会立即传递。我已在问题中更新了代码。 - Allan Vital
确保您已经在代理端启用了调度程序支持。 - Tim Bish
这是问题的一部分:如何在Spring Boot自动配置中添加调度程序支持。 - Allan Vital
不清楚,但如果你弄清楚了那部分,那应该就能解决问题了。为了支持延迟传递,经纪人需要打开这个功能。 - Tim Bish
我使用spring.activemq.broker-url=vm://embedded?broker.persistent=true&broker.schedulerSupport=true&broker.useShutdownHook=true为嵌入式ActiveMQ代理启用了调度程序支持。 - gwyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接