【问题标题】:Using spring integration aggregator for web services使用 Spring 集成聚合器进行 Web 服务
【发布时间】:2013-04-12 14:24:59
【问题描述】:

我有一些服务,其中一些是从 JMS 消息启动的,另一些是从 WS 调用启动的。对于所有这些,我已经使用 spring 集成实现了日志记录、验证、适应(XSD 到域)和持久性解决方案。它一直工作到现在。一段时间后,新的请求类型被添加到需求中。这些请求有子项,它们将被并行处理。这些子项将被组合起来,然后形成一个单一的响应。我试过聚合器,它适用于 JMS。我收集每个子项的响应,并在需要时创建主要响应。

问题在于 WS 调用它不起作用。我正在使用soapUI 进行测试,我已经发送了请求、日志记录、适应、聚合等工作,但我没有看到响应。

总结:在ws调用中使用聚合器是否会导致web服务调用线程退出,破坏请求-响应匹配机制?

编辑: 正如 Gary Russell 所建议的,我正在为问题添加细节:

<int-ws:inbound-gateway id="ws-inbound-gateway"
                        request-channel="requestMessagesChannelForWS"
                        reply-channel="ws-response-channel"
                        error-channel="ws-error-channel"
                        header-mapper="xmlMessageExtractorSoapHeaderMapper"/>

<int:header-enricher input-channel="requestMessagesChannelForWS" output-channel="headerEnricherChannel">
    <int:header name="from" ref="headersMapManagerService" method="getFromWSValue"/>
</int:header-enricher>

<int:header-enricher input-channel="headerEnricherChannel" output-channel="requestMessagesRoutingChannel">
    <int:header name="messageHeader" expression="payload.getMessageHeader()"/>
</int:header-enricher>

<int:recipient-list-router id="xmlMessageRouter"
                           input-channel="requestMessagesRoutingChannel">
    <int:recipient channel="messageToLogAdapterChannel"/>
    <int:recipient channel="requestMessageValidatorChannel"/>
</int:recipient-list-router>

我省略了 messageToLogAdapterChannel 和 requestMessageValidatorChannel 步骤。验证后流程在此处继续:

<int:chain input-channel="serviceAvailabilityCheckMessageChannelForAdaption">
    <int:transformer expression="@serviceAvailabilityCheckMessageAdapterService.adaptMessage(headers, payload)"/>
    <int:service-activator
            expression="@serviceAvailabilityCheckHandler.handleServiceAvailabilityCheckRequest(payload)"/>
</int:chain>

如您所见,链上没有定义输出通道。我手动完成。 serviceAvailabilityCheckHandler.handleServiceAvailabilityCheckRequest 方法在 BPMN 引擎(Activiti)上创建流程实例。我等待来自该引擎的关于流程完成的信号,然后创建一个新对象(不是消息)并将其发送到通道。

public void processEnded(OrderData orderData) {
    sendMessageToChannel(orderData, processResultChannel);
}

<int:router input-channel="processResultChannel" expression="payload.orderClass.name">
    <int:mapping value="domain.ServiceAvailabilityOrderRequestItem"
                 channel="serviceAvailabilityCheckCompletionChannel"/>
</int:router>

<int:service-activator input-channel="serviceAvailabilityCheckCompletionChannel"
                       output-channel="serviceAvailabilityCheckResponseItemAggregationChannel"
                       ref="serviceAvailabilityCheckHandler"
                       method="onItemComplete"/>

<int:aggregator input-channel="serviceAvailabilityCheckResponseItemAggregationChannel"
                output-channel="ws-response-channel"
                method="combineResponseItems"
                ref="serviceAvailabilityCheckHandler"
                correlation-strategy="serviceAvailabilityCheckHandler"
                correlation-strategy-method="correlateResponseItems"
                release-strategy-method="isResponseComplete"
                release-strategy="serviceAvailabilityCheckHandler"/>

使用此配置,我的聚合器工作,项目进入聚合器,然后我的自定义实现(combineResponseItems、correlateResponseItems 和 isResponseComplete)组合响应项目并将其发送到 ws-response-channel。

我遇到了这个异常:

org.springframework.integration.support.channel.ChannelResolutionException:没有可用的输出通道或replyChannel标头

恕我直言,这里的问题是:我在 handleServiceAvailabilityCheckRequest 处收到请求并启动一个进程,完成后我创建一个对象作为响应,但 spring 集成无法将该对象与请求相关联.我的响应对象中没有任何标题或与请求相关的内容。我无法将请求相关的东西传递给流程,我需要在集成层处理它。这是我卡住的地方。

【问题讨论】:

  • 是的,它工作正常;您需要展示您的配置并准确描述您遇到的问题。
  • 谢谢加里。我已在问题中添加了详细信息和我对问题的看法。

标签: web-services spring spring-integration


【解决方案1】:

如果您的流程很复杂,您可能需要增加入站网关上的reply-timeout(默认为 1 秒)。

编辑:

org.springframework.integration.support.channel.ChannelResolutionException: no output-channel or replyChannel header available

这意味着某些组件正在删除 replyChannel 标头。

同样,您需要显示整个配置。您不能随意创建新消息并期望框架知道如何处理它。

如果没有全貌(配置、代码和调试日志),很难推测发生了什么。我建议您打开调试日志记录并通过您的流程跟踪消息。如果您无法弄清楚,我们可以提供帮助,但我们可能应该转为聊天 - Stack Overflow 网站不允许进行冗长的讨论。

编辑:

正如聊天中所讨论的,您正在任意创建新消息;框架无法知道这些消息与输入相关。

【讨论】:

  • 谢谢加里。我只是想实现自定义聚合器逻辑。我预计不会超过 1 秒。
  • 谢谢 Gary,我已经为这个问题创建了一个聊天室。网址:chat.stackoverflow.com/rooms/28231/…
  • 抱歉这么久才回复;聊天没有通知我你的更新。
  • 没问题,加里,我已经在房间里回复了。谢谢。
猜你喜欢
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 2012-12-07
  • 2018-06-11
相关资源
最近更新 更多