【发布时间】: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