Я хочу создать REST-сервис для включения света. Я хочу иметь следующую архитектуру:
- Множество встроенных систем, каждая из которых подключена к одному световому экземпляру
- Каждая встроенная система имеет клиент websocket, который подключается к моему серверу.
- На моем сервере есть служба REST, которая позволяет веб-клиентам выбрать один легкий экземпляр и включить его.
- Служба REST будет иметь параметр, чтобы указать ссылку для одного экземпляра источника света, подключенного к системе и отправить сообщение клиенту websocket, дождаться сообщения подтверждения от клиента и вернуть ответ REST.
Я хотел бы сделать это с помощью Spring Integration framework. Я думал о чем-то вроде:
Запрос: входящий HTTP GW -> исходящий Websocket GW
Ответ: Входящий HTTP GW ‹- Входящий Websocket GW
Проблема в том, что я не знаю, как указать клиент websocket. Есть идеи, как это сделать?
На данный момент и на основе полученных мной ответов это псевдокод, который предоставляет решение:
<!-- REST service to turn on the light -->
<int-http:inbound-gateway
supported-methods="POST"
request-channel="lightOnRequest"
reply-channel="lightOnResponse"
path="rest/lighton/{sessionId}">
<int-http:header name="{sessionId}" expression="{sessionId}"/>
</int-http:inbound-gateway>
<!-- We add a header SESSION_ID_HEADER to choose the websocket destination client -->
<int:header-enricher
input-channel="lightOnRequest"
output-channel="lightOnClientRequest">
<int:header
name="#{T(...SimpMessageHeaderAccessor).SESSION_ID_HEADER}"
expression="headers.sessionId"/>
<int:header-channels-to-string/>
</int:header-enricher>
<!-- Websocket out to client -->
<int-websocket:outbound-channel-adapter
channel="lightOnClientRequest"
container="serverWebSocketContainer" />
<!-- Response reception from the Websocket client -->
<int-websocket:inbound-channel-adapter
channel="lightOnClientResponse"
container="serverWebSocketContainer" />
<!-- The websocket client provides again the reply channel in the headers.
The bridge connects the response to the reply channel -->
<int:bridge input-channel="lightOnClientResponse"/>