【发布时间】:2012-10-03 21:15:44
【问题描述】:
我正在使用Lamina 来实现一个基本的发布订阅模式。
当客户订阅一个主题时,我为它创建一个新的channel(如果它尚不存在),然后将siphon 它添加到客户的channel。但是,我不知道如何扭转这个让客户退订。我一直在搜索文档和谷歌搜索,但找不到任何东西。
如何撤消 siphon 所做的操作?
【问题讨论】:
标签: clojure publish-subscribe lamina-clojure
我正在使用Lamina 来实现一个基本的发布订阅模式。
当客户订阅一个主题时,我为它创建一个新的channel(如果它尚不存在),然后将siphon 它添加到客户的channel。但是,我不知道如何扭转这个让客户退订。我一直在搜索文档和谷歌搜索,但找不到任何东西。
如何撤消 siphon 所做的操作?
【问题讨论】:
标签: clojure publish-subscribe lamina-clojure
您可以fork 虹吸上方的上游通道,然后将下游通道接地,或者如果您的图表允许,您可以关闭不再希望从上游通道虹吸的通道。
ps:我稍后会尝试添加一个示例...
【讨论】:
通常您会创建一个可以关闭的桥接通道,因此链接是:
主题频道 -> 桥接频道 -> 客户频道
在 0.5.0 中,这很容易,因为 siphon 是可变参数:
(defn cancellable-siphon [src dst]
(let [bridge (channel)]
(siphon src bridge dst)
#(close bridge)))
【讨论】:
receive-all 来执行类似 #(doseq [ch subscribers] (enqueue ch %)) 的操作,或者使用桥接器 channel 引入的开销可以忽略不计?
enqueue 也不是一个好主意,因为它通过创建隐式而不是显式的消息流来破坏自动关闭行为。