使用spring集成器进行Web服务

时间:2013-04-12 14:25:00

标签: web-services spring spring-integration

我有一些服务,其中一些是从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集成无法将对象与请求关联。我的响应对象中没有任何标题或与请求相关的内容。我不能将请求相关的东西传递给进程,我需要在集成层中处理它。这是我陷入困境的地方。

1 个答案:

答案 0 :(得分:1)

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

编辑:

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

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

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

如果没有完整的图片(配置,代码和调试日志),很难推测出现了什么。我建议你打开调试日志记录并通过你的流程跟踪消息。如果您无法弄明白,我们可以提供帮助,但我们应该转而进行聊天 - Stack Overflow网站不允许长时间的讨论。

编辑:

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