提问者:小点点

将websocket入站通道适配器连接到网关的回复通道


我在请求/回复场景中,我收到需要通过相同输入连接回复的请求。要给出响应,我需要向另一个系统发出websocket请求。现在我正在通过这种方式将输出通道连接到网关的回复通道(我正在使用转换器来调整传入的消息):

<int:channel id="emrOutboundMessageTransformedChannel"/>
<int:channel id="emrInboundMessageTransformerChannel"/>
<int:channel id="emrOutboundChannel"/>
<int:channel id="cloudOutboundChannel"/>

<!-- Server WebSocket -->

<beans:bean id="webSocketClient"
  class="org.springframework.web.socket.client.standard.StandardWebSocketClient"/>

<int-websocket:client-container id="webSocketClientContainer"
  client="webSocketClient"
  uri="ws://${cloud.webSocket.host}:${cloud.webSocket.port}"/>

<!-- Client Inbound -->

<int:gateway id="emrInboundGateway"
  service-interface="com.roche.iconnect.emr.core.EmrMessageInjector">
  <int:method name="injectMessage" request-channel="emrInboundMessageTransformerChannel" reply-channel="emrOutboundMessageTransformedChannel"/>
</int:gateway>

<int:transformer
  id="emrInboundTransformer"
  input-channel="emrInboundMessageTransformerChannel"
  output-channel="cloudOutboundChannel"
  method="convertEmrMessageToGenericMessage">
  <beans:bean class="com.roche.iconnect.emr.EmrMessageAdapter"/>
</int:transformer>

<!-- Client Outbound -->

<int:transformer
  id="emrOutboundTransformer"
  input-channel="emrOutboundChannel"
  output-channel="emrOutboundMessageTransformedChannel"
  method="convertGenericMessageToEmrMessage">
  <beans:bean class="com.roche.iconnect.emr.EmrMessageAdapter"/>
</int:transformer>

<!-- Server Inbound -->

<int-websocket:inbound-channel-adapter id="webSocketClientInboundAdapter"
  container="webSocketClientContainer"
  channel="emrOutboundChannel"/>

<int-websocket:outbound-channel-adapter id="webSocketClientOutboundAdapter"
  container="webSocketClientContainer"
  channel="cloudOutboundChannel"/>

它基本上是像这样的代码组件:

CLIENT -> gateway -> transformer -> wsClient -> SERVER -> wsClient -> transformer -> gateway-reply

这里的问题是我得到一个错误:

org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available

Websocket本质上是双向的,所以我可以在不发送任何东西的情况下获取任何消息,这不是一个真正的请求/回复通道,但我需要这样使用它。websocket服务器只向以前的“请求”消息发送“回复”消息。

我需要通过网关返回websocket的响应。

更新1

头更丰富的注册表

我在网关之后添加了一个标头增强器,以对回复和错误通道进行字符串化并将其存储到注册表中:

(增加了“副本通道注册表”通道)

<int:gateway id="emrInboundGateway"
  service-interface="com.roche.iconnect.emr.core.EmrMessageInjector">
  <int:method name="injectMessage" request-channel="replyChannelRegistry" reply-channel="emrOutboundMessageTransformedChannel"/>
</int:gateway>

<beans:bean id="integrationHeaderChannelRegistry"
  class="org.springframework.integration.channel.DefaultHeaderChannelRegistry">
  <beans:constructor-arg index="0" value="${config.timeout}"/>
</beans:bean>

<int:header-enricher input-channel="replyChannelRegistry" output-channel="emrInboundMessageTransformerChannel">
  <int:header-channels-to-string time-to-live-expression="${config.timeout}"/>
  <int:correlation-id value="CORRELATION_ID_TEST"/>
</int:header-enricher>

现在问题是…我如何检索这些回复和错误通道?在通过系统的消息中,我有一个唯一的ID,我可以添加到标题中,但是我如何从这个来自websocket的相关Id中获取回复和错误通道?

更新2(已解决)

我想这种情况很常见。一个请求到达你API要响应这个请求,你必须通过一个打破请求/回复模式的通道从另一个系统获取信息。

您需要在某个地方存储您需要从请求中提取的唯一id与其到达的通道之间的映射。这个唯一id需要使用您从其他系统获得的数据重新创建,否则您将无法恢复原始通道。

步骤是:

>

  • 请求来了。
  • 使用网关组件的回复通道属性。
  • 使用header er-enrich组件(请参阅更新1)对reptyChannel进行字符串化。你不能有Map

    完成!


  • 共1个答案

    匿名用户

    您正在丢失网关的repyChannel标头;它是一个活动对象,不能通过websocket发送。

    尝试使用消息通道注册表-它将通道转换为字符串,并将通道存储在注册表中;websocket服务器必须返回String值标头,以便正确关联以将通道从注册表中取出。