我想创建一个REST服务,把灯打开。 我想拥有的架构如下:
- 许多嵌入式系统中的每个被连接到一个光实例
- 每个嵌入式系统具有的WebSocket客户端,连接到我的服务器
- 我的服务器拥有一个REST服务,允许Web客户可以选择一个光的实例,并打开它
- REST服务将有一个参数指定一个光实例的引用,连接到系统,并传送给客户端的WebSocket消息,等待来自客户端的确认消息,并返回REST答案
我想做到这一点使用Spring的集成框架。 我在想是这样的:
要求:入站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"/>