【问题标题】:How to keep messages in channel with no subscriber in Spring Integration?如何在 Spring Integration 中将消息保留在没有订阅者的频道中?
【发布时间】:2015-04-23 04:59:26
【问题描述】:

我在 Spring Integration 4.1 项目中有以下设置:

  • 订阅了发布-订阅者频道的链。
  • 启动/停止链的服务总线。

当我停止链时会发生什么,消息从主题中消失,我希望它们保留在那里,直到链再次被激活(很像 JMS 队列)。我怎样才能实现这种行为?

我已经尝试过这种方法,但我从“备份频道”收到一个错误,指出它没有任何订阅者来处理该消息:

1 - 发布-订阅者频道

2 - 正在停止/启动的链

3 - 控制总线网关

4 - 我添加了一个桥接器和一个常规通道来充当队列

这是我使用此解决方案时遇到的错误:

Caused by: org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:107)
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
... 30 more

所以,问题是:我应该如何配置我的频道,以便消息保留在那里,直到再次添加订阅者?有可能吗?

【问题讨论】:

  • 嗯,这很尴尬,但我想我只需要在频道声明中添加一个queue 元素,以便不使用DirectChannel 实现(确实需要一个消费者在场消息发送时...)

标签: spring-integration


【解决方案1】:

正确;只需将频道设为QueueChannel(添加<queue/> 子元素)并将轮询器添加到链中。

【讨论】:

  • 谢谢加里。一个问题:为什么需要向链中添加轮询器?
  • 因为队列通道需要一个轮询器来拉取消息——或者你可以在顶层声明一个默认轮询器,
  • 好的。这种隐式使用不是很直观,但幸运的是,我已经声明了一个入站适配器...... :)
  • 如果默认轮询器不存在,您将在初始化期间收到错误消息,指出没有轮询器并且没有提供默认轮询器。
猜你喜欢
  • 2017-05-05
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 2019-10-04
  • 2021-04-07
  • 2018-06-22
相关资源
最近更新 更多