我有一些服务,其中一些是从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集成无法将对象与请求关联。我的响应对象中没有任何标题或与请求相关的内容。我不能将请求相关的东西传递给进程,我需要在集成层中处理它。这是我陷入困境的地方。
答案 0 :(得分:1)
如果您的流量很复杂,您可能需要增加入站网关的reply-timeout
(默认为1秒)。
编辑:
“org.springframework.integration.support.channel.ChannelResolutionException: no output-channel or replyChannel header available
”
这意味着某些组件正在删除replyChannel标头。
同样,您需要显示整个配置。您不能随意创建新消息,并期望框架知道如何处理它。
如果没有完整的图片(配置,代码和调试日志),很难推测出现了什么。我建议你打开调试日志记录并通过你的流程跟踪消息。如果您无法弄明白,我们可以提供帮助,但我们应该转而进行聊天 - Stack Overflow网站不允许长时间的讨论。
编辑:
正如聊天中所讨论的,您随意创建新消息;框架无法知道这些消息与输入有关。