【问题标题】:Scheduling JMS listener in SpringBoot在 Spring Boot 中调度 JMS 监听器
【发布时间】:2019-11-08 16:10:34
【问题描述】:

我在 Spring Boot 应用程序中有一个方法可以侦听 ActiveMQ 中的队列。我想安排该方法,使其不会在应用程序启动时开始侦听队列并每 X 分钟运行一次。

这是我为完成任务而编写的方法。我已禁用 JMSListener 自动启动,这样它就不会在应用程序启动时开始监听。

@Scheduled(fixedDelay = 1000, initialDelay = 1000)
@JmsListener(destination = "queueName")
public void receiveMessage(final Message jsonMessage) throws JMSException {
   System.out.println("Received message " + jsonMessage);

}

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
   DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
   factory.setConnectionFactory(connectionFactory());
   factory.setConcurrency("1-1");
   factory.setAutoStartup(false);
   return factory;
}

但是当我运行应用程序时,我得到一个异常,它说调度的方法不能有参数:

Encountered invalid @Scheduled method 'receiveMessage': Only no-arg methods may be annotated with @Scheduled

有没有办法可以安排JMSListener,使其在应用程序启动延迟后启动,并安排为每 X 分钟运行一次并从队列中读取消息?

【问题讨论】:

  • 我认为注释@Scheduled@JmsListener 不兼容。为什么需要这种行为?
  • 你应该问自己:“如果你不想听,为什么要使用监听器?”并且可能会考虑其他解决方案,例如 100% 的时间聆听,将消息叠加到您的应用程序中,并在您想要执行的那一刻处理消息。

标签: java spring spring-boot activemq spring-jms


【解决方案1】:

你不能在那里使用@Scheduled

使用JmsListenerEndpointRegistry bean 在需要时启动和停止监听器。

@JmsListener(id = "foo" ...)


registry.getListenerContainer("foo").start();
...
registry.getListenerContainer("foo").stop();

【讨论】:

    猜你喜欢
    • 2017-01-23
    • 1970-01-01
    • 2020-10-28
    • 2023-03-26
    • 1970-01-01
    • 2020-08-20
    • 2018-08-22
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多