2

パブリッシャーとして機能するチャンネルがあります。

(def publisher (async/chan))
(def publication (async/pub publisher :topic))

の性質上、sub/pubこれを行うと:

(async/put! publisher {:topic :foo})

メッセージはパブリケーションによって消費されますが、サブスクライバーが存在しないため、ドロップされます。

:fooトピックをサブスクライブしようとすると:

(def reader (async/chan))
(async/sub publication :foo reader)
(async/go (println "got val " (async/<! reader)))

何も印刷されていません。しかし、パブリッシャーにさらにアイテムを入れると:

(async/put! c1 {:topic :foo :msg "after"})
==> got val {:topic :foo :msg "after"}

たとえば、サブスクライバーがまだサブスクライブしていなくてもn、パブリッシャーによって作成された最後のアイテムを失わないようにする方法はありますか?

4

2 に答える 2

3

pubbuf-fnトピックが与えられた関数を受け入れます。この関数はバッファを返す必要があります。dropping-bufferまたはなどsliding-buffer。したがって、:fooトピックをバッファリングする場合は、次のようにします。

(pub pub-ch :topic #(if (= % :foo) (sliding-buffer 10) nil))

関連するコード セクションも参照してください。

于 2015-04-07T02:23:00.383 に答える
0

ドキュメントは明示的です:

一致する登録者がいないときに受け取ったアイテムはドロップされます

于 2015-02-25T00:21:30.183 に答える