我有一個要求,即PHP Web應用程序將消息寫入非阻塞隊列,並且其他進程會將它們出列。我目前的設計是PHP應用程序創建一個ZMQ.PUSH
套接字,做一個connect
到目的地址和send
的消息。在目的地,一個進程(Java)創建一個ZMQ.PULL
套接字,在同一個地址和receive
上執行bind
消息。但是,當出列器進程關閉(或未啓動)時,PHP應用程序在此期間發送的消息會丟失(當進程在同一地址上再次啓動時,不會將其發送到出隊器)。這是PHP應用程序每次創建新的ZMQ.Context
的問題嗎?ZMQ PUSH/PULL模型:當節點按下消息並退出時丟失消息
作爲一個例子,我創建了另一個Java進程來將消息寫入隊列。
public static void main(String[] args) {
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.PUSH);
socket.connect("tcp://localhost:5557");
for(int i = 0; i < 10; i++) {
socket.send(("Sending : " + message).getBytes(), 0);
}
}
如果上述過程在上述過程完成時未啓動,那麼這與丟失消息具有相同的問題。
但是,在上述方法主體的末尾添加一個while(true) {}
不會導致任何丟失的消息 - 所有消息都在出列隊列啓動時傳遞。那麼我是否正確地假設ZMQ.Context
對象被垃圾回收導致問題在這裏?如果是,那麼如何在PHP Web應用程序中解決這個問題?由於我無法堅持ZMQ.Context
的對象。