【问题标题】:Spring Integration - programmatically create / teardown channelsSpring Integration - 以编程方式创建/拆除通道
【发布时间】:2013-12-06 06:16:48
【问题描述】:

是否可以以编程方式创建/拆除 Spring 集成通道,而不是在 Spring 配置中静态声明它们?

我的情况是这样的:

我有一个需要推送通知的 web 应用程序,所以我正在使用长轮询。那些长轮询调用需要在服务器上阻塞,直到它们得到一个事件。

我所设想的(当然,对替代方案开放)是 每个会话 的 Spring Integration 队列通道,每个会话都侦听一个 pubsub 通道。因此,当服务器事件发生时,它将被发布到 pubsub,然后它将向下传递到各个会话队列,在那里它们将被弹出并发送到正在轮询的客户端。

为了做到这一点,当创建会话时,我必须在 pubsub 频道上注册新的队列频道列表。当会话被销毁时,新队列也将被销毁。

这样的事情可能吗?

我不想让会话直接监听 pubsub,因为存在丢失消息的风险,所以我希望在中间有一个队列来缓冲它们。

谢谢, 罗伊

【问题讨论】:

    标签: spring spring-integration


    【解决方案1】:

    是的,您可以简单地实例化 QueueChannel 并将其设置为 outputChannel 的 BridgeHandler。然后创建一个EventDrivenConsumer,在构造函数中传递 pubSub 和桥处理程序。

    在消费者上调用start() 使其订阅pubSub,并在会话关闭时取消订阅stop()。

    如果您不想手动连接这些组件,只需声明队列通道,并在小型应用程序上下文中进行桥接;使其成为您的主上下文的子项,它将自动订阅父上下文中的 pubSub。拨打context.destroy()断开连接。

    【讨论】:

    • 太棒了。对于其他有需要的人,我为代码示例创建了一个要点:gist.github.com/roytruelove/7589536
    • 对此的另一个警告 - 如果有人试图向其发布消息,频道总是必须至少有一个订阅者。由于我们正在动态创建订阅,因此给定频道可能还没有订阅者。要解决这个问题,您需要使用(至少)一个 NullChannel 订阅 pubsub 频道。
    • 点对点SubscribableChannel(例如DirectChannel)不能有零订阅者,但是,与 JMS 主题一样,PubSub 频道可以有零订阅者,并且消息会被丢弃。这可以使用minSubscribers 属性进行修改,但默认为零。可以使用 DEBUG 日志记录检查该行为。
    • 更正-抱歉-这是频道本身的行为;但是,一些发件人会检测到零个收件人并抛出异常。这包括MessagingTemplate,框架在内部使用它来发送消息。所以你的解决方案也能解决这个问题。
    • 我相信这在 3.0 中有所改变,但我们目前仍在发布版本。
    猜你喜欢
    • 2015-10-17
    • 2015-01-29
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多