'仅限最后一条消息' ZMQ中的选项订阅套接字

时间:2016-07-07 23:43:32

标签: f# zeromq

当CONFLATE选项设置为true时,ZMQ订阅者套接字仅保留队列中的最后一条消息。 (zmq_docs)但是,它似乎对我不起作用。通常在python中我会做类似下面的事情,它会工作:

context = zmq.Context()
subscriber = context.socket(zmq.SUB)
subscriber.setsockopt(zmq.CONFLATE, 1)
subscriber.connect("tcp://localhost:5555")

下面的pub / sub模式中的订阅者只是忽略设置为1的CONFLATE选项。您可以通过订阅者显示的分钟和秒来观察程序在处理旧消息时是否被绑定(文档42)。如果将fib设置为一个微不足道的值,您可以看到订阅者确实正在接收来自发布者的消息。

以下是发布商:

open System
open fszmq
open fszmq.Context
open fszmq.Socket


let funcPublish () =
  use context   = new Context()
  use publisher = pub context
  "tcp://*:5563" |> bind publisher

  while true do
    let tm = System.DateTime.Now
    let t = String.Concat([tm.Minute.ToString(); " "; tm.Second.ToString()])
    t |> s_send publisher
    sleep 1

  EXIT_SUCCESS


[<EntryPoint>]
let main argv = 
    funcPublish ()
    0

以下是订阅者:

open fszmq
open fszmq.Context
open fszmq.Socket

let rec fib n =
    match n with
    | 1 | 2 -> 1
    | n -> fib(n-1) + fib(n-2)

let funcSubscribe () = 
  use context    = new Context()
  use subscriber = sub context
  "tcp://localhost:5563" |> connect subscriber
  Socket.setOption subscriber (ZMQ.CONFLATE, 1)
  [ ""B ] |> subscribe subscriber


  while true do
    let contents = s_recv subscriber
    fib 42
    contents |> printfn "%A"

  EXIT_SUCCESS


[<EntryPoint>]
let main argv = 
    funcSubscribe ()
    0

感谢。

1 个答案:

答案 0 :(得分:6)

我注意到你的Python代码和你的F#代码之间存在一个区别。在Python中,在连接到套接字之前设置CONFLATE选项,但在F#中,在连接之后设置CONFLATE选项

如果您将Socket.setOption行移至F#代码中的connect subscriber行之前,我怀疑这应该可以解决您的问题。

换句话说,而不是:

"tcp://localhost:5563" |> connect subscriber
Socket.setOption subscriber (ZMQ.CONFLATE, 1)

你应该有这个:

Socket.setOption subscriber (ZMQ.CONFLATE, 1)
"tcp://localhost:5563" |> connect subscriber