Spring集成连接出站入站HTTP网关的WebSocket gateaway(Spring int

2019-10-22 06:15发布

我想创建一个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"/>

Answer 1:

不幸的是,你的问题是不明确的。 如果您的WebSocket的东西是基于Spring Integration的WebSocket的适配器,你有ServerWebSocketContainer具有getSessions()返回Map<String, WebSocketSession>连接的客户端会话。 因此,你可以接触到最终用户通过REST服务。

当客户端选择一个会话并发送一个HTTP请求可以简单地转发与该消息SimpMessageHeaderAccessor.SESSION_ID_HEADER<int-websocket:outbound-channel-adapter>

是的,可以接收使用确认<int-websocket:inbound-channel-adapter> ,它会自动转发到REST响应。 但要做到这一点,你应该转换TemporaryReplyChannel<int-http:inbound-gateway>String使用<header-channels-to-string><header-enricher>

您的客户端的WebSocket应用程序必须确保返回与那些请求头replyChannel ,当它发送确认到会话中。 与Spring集成在那边一切都应该是透明的。

让我知道如果我错过了一些东西。

UPDATE

好。 感谢您的更多信息! 你的配置看起来不错。 一些备注:1。没有必要有reply-channel="lightOnResponse" :HTTP入站网关等待来自回复TemporaryReplyChannel非常好。 2.请,添加<header-channels-to-string>到您<header-enricher>转发到网页套接字之前。 3. <int-websocket:inbound-channel-adapter>可以只发送其入站消息,以简单的bridge<bridge input-channel="lightOnClientResponse"> 在这种情况下不output-channel它委派消息至replyChannel从标头。 因此,您的HTTP入站网关将收到相应回复。



文章来源: Spring integration connecting inbound HTTP gateway with outbound Websocket gateaway