当前位置: 首页 > 知识库问答 >
问题:

ActiveMQ在Spring Boot中延迟消息传递

廉宇
2023-03-14

我的问题与Spring JMS(ActiveMQ)延迟传递消息非常相似,但与Spring boot自动配置程序更相关

我试图使用jmsTemplate.setDeliveryDelay方法,但它抛出了一个java.lang.IllegalStateExcue: setDeliveryDelay需要JMS 2.0

我试着从他那里找到合适的房产http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html但找不到broker schedulerSupport选项。

目前,我的申请。属性为空,我的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中的Spring-boot-starter-父级。发布

问题是:是否可以使用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个答案

明星剑
2023-03-14

我不知道这是否是作弊,但对我来说,解决问题的方法是将启动器从activemq更改为artemis(https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-artemis)

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

丁均
2023-03-14

该模板试图调用JMS 2.0交付延迟方法,但ActiveMQ客户端和代理只支持JMS 1.1,因此您将收到此错误。通过使用此处定义的值在消息中设置消息属性,可以将ActiveMQ支持用于计划交付。

目前还不完全清楚如何从Spring boot启用调度器,但我猜您需要提供自己的代理URI来启用它,比如:

broker:(tcp://localhost:61616)?persistent=true&useJmx=false&schedulerSupport=true
 类似资料:
  • spring XML中的jmsTemplate定义: 有人对问题有什么建议吗/关于如何实现延迟消息传递的其他想法?谢了!

  • 此应用程序收到 但是,当不存在web套接字会话,并且JMSProducer将消息发送到QueueSenderSessionBean中的目标“jms/notificationQueue”时,消息会立即在NotificationEndpoint中使用。这不是我的意图。 我的目的是让队列保留消息,直到用户连接到NotificationEndpoint。如果用户没有连接到NotificationEndpo

  • 主要内容:1 load加载延迟消息数据,1.1 parseDelayLevel解析延迟等级,2 start启动调度消息服务,3 DeliverDelayedMessageTimerTask投递延迟消息任务,3.1 executeOnTimeup执行延迟消息投递,3.2 scheduleNextTimerTask下一个调度任务,3.3 correctDeliverTimestamp校验投递时间,3.4 messageTimeup恢复正常消息,,基于RocketMQ release-4.9.3,深入

  • 我遇到了在多个请求下扩展应用程序的问题。 每个请求都向一个参与者发送一个ask,然后生成其他参与者。这是很好的,但是,在负载下(一次5个以上的询问),会花费大量的时间将消息传递给目标执行元。最初的设计是均匀地隔离请求,但这造成了一个瓶颈。示例: 在此图片中,是在查询计划解析程序之后发送的。但是,当执行元接收到此消息时有一个多秒的间隔。这只在负载(5+请求/秒)下才会出现。我最初以为这是一个饥饿的问

  • 如何使用Apache Kafka生成/使用延迟消息?标准的Kafka(和Java的kafka-client)功能似乎没有这个特性。我知道我自己可以用标准的等待/通知机制来实现它,但是它看起来不是很可靠,所以任何建议和好的实践都很感谢。 找到相关问题,但没有帮助。正如我所看到的:Kafka基于从文件系统的顺序读取,并且只能用于直接读取主题,保持消息的顺序。我说的对吗?

  • 我一直在监视我的微服务应用程序的端到端延迟。每个服务通过ActiveMQ Artemis队列松散耦合。 服务1作为HTTPendpoint侦听并生成队列1。服务2从队列1消费,修改消息,并生成到队列2。服务3从队列2消耗。每个服务在单独的表中向db插入一行。从那里我还可以监视延迟。因此,“端到端”将进入“服务1”,并从“服务3”中出来。 每个服务处理时间保持稳定,并且大多数消息具有几毫秒的合理e2