Spring 集成默认消息侦听器容器 IsRunning false

Spring Integration Default Message Listener Container IsRunning false

我使用以下配置在 Java DSL 中定义了一个 JMS 消息侦听器。听众工作正常。它按预期处理来自队列的消息。我没有配置自动启动,因为默认值为 true,我需要在应用程序启动后监听器为 运行。当我尝试在应用程序启动期间调用 isRunning() 方法时,isRunning 方法 returns 为 false。我在这里缺少一些配置吗

/**
Configuration for  the Message Listener
**/
@Bean
public DefaultMessageListenerContainer inListener(){
DefaultMessageListenerContainer defaultMessageListenerContainer = new DefaultMessageListenerContainer();
defaultMessageListenerContainer.setConnectionFactory((ConnectionFactory)connectionFactory().getObject());
defaultMessageListenerContainer.setDestinationName(queueName);
defaultMessageListenerContainer.setIdleTaskExecutionLimit(100);
defaultMessageListenerContainer.setMaxConcurrentConsumers(1);
defaultMessageListenerContainer.setSessionTransacted(true);
defaultMessageListenerContainer.setPubSubDomain(false);
defaultMessageListenerContainer.setDestinationResolver(jndiDestResolver);
}

@Bean
public JndiObjectFactoryBean connectionFactory(){
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiTemplate(jndiTemplate);
jndiObjectFactoryBean.setJndiName(jndiName);
return jndiObjectFactoryBean;
}

消息监听器

@Bean
public IntegrationFlow adapter(){
return IntegrationFlow.from(Jms.messageDrivenChannelAdapter(inListener()).channel(inputChannel()).get();
}

IsRunning 代码:此代码正在另一个 class 的后构造方法中使用。 Autostartup 的第一个打印语句打印 true,而 isRunning 打印语句打印 false。这里是否缺少某些配置

AbstractMessageListenerContainer listener = (AbstractMessageListenerContainer) applicationContext.getBean("inListener");
System.out.println("Autostartup: "+ listener.isAutoStartup());
System.out.println("Running: "+ listener.isRunning());

@PostConstruct 对于生命周期控制来说还为时过早。这完全等同于特定 bean 的 afterPropertiesSet()。当应用程序上下文中的所有 bean 都已经准备好时,autoStartup 生命周期的 start() 稍后会被调用。

对于您的逻辑,您应该真正考虑实现一个 SmartLifecycle 来执行所需的逻辑。

在文档中查看更多信息:https://docs.spring.io/spring/docs/5.2.7.RELEASE/spring-framework-reference/core.html#beans-factory-lifecycle-processor