从字面上看,如果您只想停止侦听器然后启动它ApplicationReadyEvent
,然后你可以自动装配ServiceBusInboundChannelAdapter
(or ServiceBusMessageListenerContainer
) 在你的AppEventListenerService.java
然后简单地调用它的 stop() 和 start() APIAppEventListenerService#OnApplicationStarted
method.
然而,两者ServiceBusMessageListenerContainer
and ServiceBusInboundChannelAdapter
实施SmartLifecycle
接口并默认启用自动启动。所以如果使用上面的解决方案,监听器(以及适配器)之前已经被触发启动ApplicationReadyEvent
,这意味着监听器仍然会在一段时间内消费消息。
所以我假设您可能想要关闭监听器,直到您自己的业务逻辑完成为止。如果是的话,那么目前ServiceBusMessageListenerContainer
不提供禁用自动启动的功能,我们会将您的功能请求放入我们的待办事项中。
但您仍然可以使用以下解决方法来满足您的请求。
解决方法-1
- 您可以延长
ServiceBusMessageListenerContainer
覆盖自动启动行为,
public class CustomServiceBusMessageListenerContainer extends ServiceBusMessageListenerContainer {
private boolean autoStartUp = true;
/**
* Create an instance using the supplied processor factory and container properties.
* @param processorFactory the processor factory.
* @param containerProperties the container properties.
*/
public CustomServiceBusMessageListenerContainer(ServiceBusProcessorFactory processorFactory, ServiceBusContainerProperties containerProperties) {
super(processorFactory, containerProperties);
}
public void setAutoStartUp(boolean autoStartUp) {
this.autoStartUp = autoStartUp;
}
@Override
public final boolean isAutoStartup() {
return this.autoStartUp;
}
}
- 声明时
ServiceBusMessageListenerContainer
and ServiceBusInboundChannelAdapter
bean,禁用其自动启动功能。
@Bean(SERVICE_BUS_LISTENER_CONTAINER)
public ServiceBusMessageListenerContainer messageListenerContainer(ServiceBusProcessorFactory processorFactory) {
ServiceBusContainerProperties containerProperties = new ServiceBusContainerProperties();
containerProperties.setEntityName(QUEUE_NAME);
...
CustomServiceBusMessageListenerContainer listenerContainer = new CustomServiceBusMessageListenerContainer(processorFactory, containerProperties);
listenerContainer.setAutoStartUp(false);
return listenerContainer;
}
@Bean
public ServiceBusInboundChannelAdapter queueMessageChannelAdapter(
@Qualifier(SERVICE_BUS_INPUT_CHANNEL) MessageChannel inputChannel,
@Qualifier(SERVICE_BUS_LISTENER_CONTAINER) ServiceBusMessageListenerContainer listenerContainer) {
ServiceBusInboundChannelAdapter adapter = new ServiceBusInboundChannelAdapter(listenerContainer);
adapter.setOutputChannel(inputChannel);
adapter.setAutoStartup(false);
return adapter;
}
- 开始
ServiceBusInboundChannelAdapter
在你的业务逻辑之后AppEventListenerService#OnApplicationStarted
.
解决方法-2
这可能有点 hack,因为我们没有公开 api 来禁用自动启动ServiceBusMessageListenerContainer
,但可以在ServiceBusInboundChannelAdapter
。所以你可以选择不声明一个beanServiceBusMessageListenerContainer
但将其更改为适配器的局部变量,
@Bean
public ServiceBusInboundChannelAdapter queueMessageChannelAdapter(
@Qualifier(SERVICE_BUS_INPUT_CHANNEL) MessageChannel inputChannel, ServiceBusProcessorFactory processorFactory) {
ServiceBusContainerProperties containerProperties = new ServiceBusContainerProperties();
containerProperties.setEntityName(QUEUE_NAME);
...
ServiceBusMessageListenerContainer listenerContainer = new ServiceBusMessageListenerContainer(processorFactory, containerProperties);
ServiceBusInboundChannelAdapter adapter = new ServiceBusInboundChannelAdapter(listenerContainer);
adapter.setOutputChannel(inputChannel);
adapter.setAutoStartup(false);
return adapter;
}
然后开始ServiceBusInboundChannelAdapter
在你的业务逻辑之后AppEventListenerService#OnApplicationStarted
.