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