ActiveMQ延迟了Spring Boot中的消息传递

时间:2016-11-03 21:17:44

标签: java spring-boot jms activemq

我的问题与Spring JMS(ActiveMQ) delayed delivery of messages非常相似,但与spring-boot auto configurer

更相关

我尝试使用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?

如果需要,这是我的发件人

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;
}

2 个答案:

答案 0 :(得分:1)

模板正在尝试调用JMS 2.0传递延迟方法,但ActiveMQ客户端和代理仅支持JMS 1.1,因此您将收到此错误。您可以使用定义here的值在邮件中设置邮件属性,从而使用ActiveMQ支持进行计划投放。

目前还不完全清楚如何从Spring启动调度程序,但我的猜测是你需要提供自己的Broker URI来启用它,例如:

broker:(tcp://localhost:61616)?persistent=true&useJmx=false&schedulerSupport=true

答案 1 :(得分:1)

我不知道它是否在作弊,但是解决了这个问题的原因是将起动器从activemq更改为artemis(https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-artemis

显然,spring默认将Artemis配置为JMS 2.0界面。这样您就可以访问setDeliveryDelay方法。