У меня есть требование, чтобы веб-приложение PHP записывало сообщения в неблокирующую очередь, а другие процессы снимали их с очереди.Мой текущий дизайн - приложение PHP: создайте сокет ZMQ.PUSH
, введите connect
по адресу назначения и send
сообщение.Находясь в месте назначения, процесс (Java) создает сокет ZMQ.PULL
, делает bind
по тому же адресу и receive
сообщение.Однако, когда процесс dequeuer выключен (или не запущен), сообщения, отправленные приложением PHP в течение этого времени, теряются (не доставляются на dequeuer, когда процесс запускается снова по тому же адресу).Это проблема с приложением PHP, создающим новый ZMQ.Context
каждый раз?
В качестве примера я создал другой процесс 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) {}
в конец описанного выше метода не приводит к потере сообщений - все сообщения доставляются при запуске dequeuer.Итак, я прав в предположении, что объект ZMQ.Context
, собираемый мусором, вызывает проблему здесь?Если да, то как решить эту проблему в веб-приложении на PHP?Поскольку я не могу сохранить объект ZMQ.Context
.