Я использую клиент PHP Stomp для отправки сообщения stomp.
Я хотел бы оставить постоянное соединение открытым, на заднем плане, и отправлять сообщения время от времени.
Однако я не могу найти способ справиться с ошибками соединения, если они произойдут после открытия соединения (при отправке ()).
Например, при запуске:
<?php $stomp = new Stomp('tcp://localhost:61613'); sleep(5); // Connection goes down in the meantime $result = $stomp->send('/topic/test', 'TEST'); print "send " . ($result ? "successful\n": "failed\n"); ?>
Выход: send successful
Даже если соединение отключается во время sleep()
, send()
всегда возвращает true.
Документы не очень помогли, Stomp::error()
и stomp_connect_error()
также не помогают, поскольку они возвращают false
.
Как временное решение, я снова подключаюсь к каждой send()
.
Есть ли лучший способ уловить ошибки соединения?
Нашел ответ в спецификации самого протокола stomp:
Любой клиентский кадр, отличный от CONNECT MAY, указывает заголовок квитанции с произвольным значением. Это приведет к тому, что сервер подтвердит получение кадра с кадром RECEIPT, который содержит значение этого заголовка в качестве значения заголовка идентификатора приема в кадре RECEIPT.
Поэтому настройка заголовка «получение» делает запрос синхронным, поэтому соединение с сервером должно быть живым.
Итак, код:
$result = $stomp->send('/topic/test', 'TEST'); print "send " . ($result ? "successful\n": "failed\n"); $result = $stomp->send('/topic/test', 'TEST', array('receipt' => 'message-123')); print "send " . ($result ? "successful\n": "failed\n");
Дает выход:
send successful send failed
Это не похоже на лучшее решение для этого случая, но оно работает для меня.
Если кто-то знает лучший способ, я буду рад услышать это.
Обновить:
В конце концов я переключился на Stomp-PHP (чистый PHP-клиент) вместо клиента Pecl stomp, который обрабатывает его намного лучше .