0

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

4

1 回答 1

1

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

编辑:

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

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

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

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

编辑:

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

于 2013-04-12T15:34:45.783 回答