ServiceActivator'随机'取消订阅PublishSubscribeChannel

时间:2016-03-04 23:49:57

标签: java spring spring-integration

我有一个用@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"在日志中。

1 个答案:

答案 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记录进行记录时)。