Необходимо опросить брокера Mqtt из Java REST API на предмет уже опубликованных сообщений в MQTT

Ищу решение для опроса сообщений от брокера MQTT. Я кратко опишу решение здесь.

У нас есть класс контроллера на основе Spring, который предоставляет REST API для обработки определенных диагностических данных, связанных с автомобилем. С помощью одного из этих API Notify3P() я создаю клиент Java MQTT и публикую сообщения на основе некоторых входных данных для брокера MQTT по заданной теме. Мое требование - уведомлять стороннюю систему каждый раз, когда клиент публикует сообщение в MQTT.

Система 3P собирается забрать сообщение от MQTT, как только получит уведомление. Затем ему необходимо получить сообщение от брокера MQTT через getMessage() REST API (который нам нужно предоставить в указанном выше классе контроллера). getMessage() API должен опрашивать MQTT на наличие уже опубликованных сообщений и передавать их в систему 3P. Затем система 3P произведет некоторую обработку и отправит ответ нашей системе через другой REST API postMessage(), представленный в нашем классе контроллера. postMessage() должен опубликовать сообщение в теме response на MQTT. Мне нужен другой REST API checkResponse(), который затем опрашивает response тему MQTT и отправляет ответ клиенту.

Что я сделал до сих пор: при запуске приложения у меня есть запускаемый компонент, который прослушивает темы MQTT request и response. Теперь я публикую данные в request теме с помощью REST API Notify3P(). Я прикрепил обратный вызов к компоненту запуска, который получает сообщение. Проблема возникает, когда 3P необходимо вызвать мой контроллер для опроса сообщения от MQTT.

Я не понимаю, как удерживать сообщения в MQTT и потреблять их по запросу. Есть ли в MQTT механизм для этого? Также, как только система 3P отправляет сообщения на response, как мне опросить тему response, чтобы получить ответ от MQTT и отправить его клиентам моего Контроллера?

Надеюсь, описание проблемы имеет смысл. Если есть какое-либо решение от кого-либо, пожалуйста, опубликуйте его. Любой пример кода будет большим подспорьем.

Заранее спасибо!!


person chakrar    schedule 01.11.2013    source источник


Ответы (1)


Возможно, вы немного запутались в MQTT. Один из ключевых моментов - отсутствие опроса.

Вы подписываетесь на вашу response тему и публикуете ее в request теме. Как только ответ будет доступен, брокер отправит его вам. Вы не можете сдерживать сообщения.

Похоже, ваш контроллер также должен поддерживать MQTT. Если он подписан на response тему с самого начала, он будет получать сообщения, и вы можете делать с ними все, что захотите, без опроса.

Чтобы добиться именно того, что вы хотите, если третья сторона уведомляет контроллер о чтении сообщений из MQTT, тогда контроллер в любом случае должен иметь возможность использовать MQTT. В этот момент вы могли бы сделать это «должным образом». Если вы не хотите интегрировать MQTT в свой контроллер, вы не можете делать то, что описываете, и вам придется придумать другое средство связи между двумя компонентами.

Резюме - заставьте ваш контроллер говорить MQTT, если можете.

person ralight    schedule 01.11.2013
comment
Привет, @Ralight, спасибо за ваш пост. У моего контроллера есть только некоторые API-интерфейсы REST, доступные для его вызывающих. У меня есть запускаемый Spring bean-компонент, который подписывается на тему запроса на брокере. Затем через мой контроллер API клиенты отправляют свои данные в Request Topic. В этот момент срабатывает обратный вызов моего стартового компонента, и при любом поступлении сообщения он уведомляет 3P. Теперь 3P необходимо получить сообщение через API, представленный на контроллере. Это связано с тем, что система 3P может не захотеть обрабатывать сообщение немедленно. Я думаю, единственным решением было бы поместить сообщения на глобальную карту, такую ​​как структура данных. - person chakrar; 01.11.2013
comment
Да, сообщения нужно будет где-то хранить, чтобы делать то, что вы хотите. - person ralight; 01.11.2013
comment
Пожалуйста, поправьте меня, если я ошибаюсь. Предположим, я хочу публиковать сообщения в MQTT от клиента. И я хочу получать опубликованные сообщения одно за другим от брокера MQTT. Этот конкретный сценарий невозможно реализовать с помощью MQTT. Мне нужно где-то сохранить сообщение и получить его оттуда. Я прав? Если я правильно понимаю, тогда мой вопрос: зачем нужны эти накладные расходы на поддержку отдельного хранилища сообщений? Почему мы не можем использовать для этого очереди брокеров mqtt? - person chakrar; 04.11.2013
comment
Простой ответ заключается в том, что протокол просто не предназначен для того, чтобы делать то, что вы хотите. Вы можете заставить его делать то, что хотите, сохраняя сообщения вручную, но средства для опроса брокера на предмет сохраненных сообщений просто не существует. Вы можете подключиться с помощью clean_session = false, подписаться, затем отключиться, и в следующий раз, когда вы подключитесь, вы получите сообщения, отправленные в ваше отсутствие, но все они, а не одно за другим, как вы их просили. Это не имеет отношения к брокеру, это протокол. - person ralight; 04.11.2013