首页 文章

ZMQ订阅套接字中的'Last message only'选项

提问于
浏览
3

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

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

下面的发布/订阅模式中的订阅者只是忽略设置为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 回答

  • 5

    我注意到你的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
    

相关问题