我有一个用@ServiceActivator注释的方法(" CH1"),其中" CH1"定义是:
@Bean(name = "CH1")
MessageChannel ch1() {
return new PublishSubscribeChannel
}
和其他PollableChannels通过
发布到此频道 @BidgeTo(value = "CH1", poller = @Poller("myPoller"))
事情似乎在大多数时候都很好;然而,看似随机的消息处理程序取消了" CH1"我在日志中看到:
[DEBUG] (pool-2-thread-1) org.springframework.integration.dispatcher.BroadcastingDispatcher: No subscribers, default behavior is ignore
现在我知道我可以改变minSubscribers,但我不明白为什么事情似乎随机取消订阅?在此错误之后,它将返回处理一些消息。消息处理程序在处理消息时是否取消订阅,或者正在使用的执行程序是否已满?我在日志中看到没有与此相关的错误,也没有取消订阅或更新订阅者计数到" CH1"在日志中。
答案 0 :(得分:2)
这没有意义。请分享一些测试用例以从Framework透视图重现。
关于此事的源代码如下:
if (dispatched == 0 && this.minSubscribers == 0 && logger.isDebugEnabled()) {
if (sequenceSize > 0) {
logger.debug("No subscribers received message, default behavior is ignore");
}
else {
logger.debug("No subscribers, default behavior is ignore");
}
}
我们只能在以下情况下转到sequence == 0
:
Collection<MessageHandler> handlers = this.getHandlers();
if (this.requireSubscribers && handlers.size() == 0) {
throw new MessageDispatchingException(message, "Dispatcher has no subscribers");
}
int sequenceSize = handlers.size();
只有您的订阅者以某种方式取消订阅的线索......
我看到您的CH1
有一个调试,所以当您看到错误时,您是否愿意分享整个org.springframework.integration
的DEBUG日志。
修改强>
另请注意,无论何时添加/删除订阅者(例如,当启动/停止消费端点时),您都会看到此日志消息...
if (logger.isInfoEnabled()) {
logger.info("Channel '" + this.getFullChannelName() + "' has " + counter + " subscriber(s).");
}
(至少使用INFO记录进行记录时)。