Spring AMQP принимает меры по тайм-ауту сообщения

Я использую Spring AMQP с асинхронным обменом сообщениями. Моя модель предполагает, что есть два приложения A и B, как производители, так и потребители.

  • A отправляет запрос на задание B и начинает прослушивание.
  • B прослушивает запрос на задание и, когда он приходит, запускает задание и периодически отправляет сообщения о ходе выполнения A.
  • B отправляет сообщение о завершении задания A после завершения задания.
  • A потребляет сообщения о ходе выполнения до тех пор, пока не придет сообщение о завершении задания, после чего A существует.

Я использую @RabbitListener на уровне класса и @RabbitHandler на уровне метода для обработки сообщений. Все работает хорошо, дизайн чистый, мне нравится решение Spring.

Моя проблема в том, что я понятия не имею, как обнаружить и как действовать, когда A ожидает получить сообщение о ходе выполнения от B (любое сообщение), а оно не приходит. Есть ли тайм-аут для таких случаев? Если да, то как реализовать метод обратного вызова?

Я нашел некоторые настройки таймаута, но они обычно работают для самого соединения или только при использовании шаблона RPC (один запрос один ответ).

Желаемое решение: A должен получать сообщение о ходе выполнения каждую минуту. Если сообщение о ходе выполнения не используется, скажем, в течение 3 минут, я хочу отменить задание.


person wst    schedule 06.01.2016    source источник


Ответы (1)


При использовании асинхронных потребителей отсутствует механизм генерации события, если сообщение не получено в течение определенного периода времени.

Однако вы можете запланировать свою собственную задачу и отменить/перенести задачу, когда придет сообщение.

Используйте TaskScheduler с

future = schedule(myRunnable, new Date(System.currentTimeMillis() + 180000));

используйте future.cancel(), когда приходит сообщение.

person Gary Russell    schedule 06.01.2016
comment
Очень жаль, потому что текущее решение довольно чистое... Есть ли шанс, что такая функция может быть запрошена и реализована в будущем? Ведь родной клиент rabbitmq позволяет получать с тайм-аутом. Для весны это может быть просто вопрос представления для него события. - person wst; 07.01.2016
comment
На самом деле это было бы довольно тривиально реализовать (и это не первый раз, когда об этом просят); плюс это позволит избежать любых условий гонки, потому что событие отсутствия сообщения может быть опубликовано в том же потоке прослушивателя. Не стесняйтесь открывать новую функцию JIRA issue. А пока вместо использования @RabbitListener для сообщений о ходе выполнения вы можете использовать rabbitTemplate.receiveAndConvert() с шаблон с тайм-аутом получения. - person Gary Russell; 07.01.2016
comment
Доступно в 1.6. 0.СТРОЙКА-СНИМОК. Мы рассчитываем выпустить первую веху 1.6 через несколько недель, а общедоступная версия ожидается позже в этом году. Пожалуйста, попробуйте его, если у вас есть шанс убедиться, что он удовлетворяет ваши потребности. - person Gary Russell; 08.01.2016
comment
Да, я видел прогресс. Спасибо большое. - person wst; 09.01.2016