弹簧集成中的错误处理

时间:2017-07-06 16:49:37

标签: error-handling spring-integration

我有三种不同的系统。我正在使用Spring集成来同步所有这些系统中的数据。

系统1呼叫--->系统2通过http:入站网关

<int-http:inbound-gateway id="gateway"
    path="/save" supported-methods="POST, PUT"
    request-channel="requestChannel" reply-channel="replyChannel"
    request-payload-type="com.model.Request"
    mapped-request-headers="source" error-channel="errorChannel" />

系统2将调用service方法来持久化数据,如果请求有效则返回响应,否则抛出异常

<int:service-activator ref="serviceMethod"
    method="saveIfValid" input-channel="requestChannel"
    output-channel="serviceOutput" />

<int:recipient-list-router id="id1"
    input-channel="serviceOutput">
    <int:recipient channel="system1" />
    <int:recipient channel="system3" />
</int:recipient-list-router>

只有在操作成功时才​​需要向系统1和系统3发送服务方法响应。  在调用服务方法之后,基于服务方法响应,将使用变换器生成对系统3的请求。变压器后,我将请求放入mq队列。

<int:transformer id="transformer1"
    method="convert" input-channel="system3"
    output-channel="jmsInput">
    <bean
        class="com.transformer.System3Transformer" />
</int:transformer> 


<int-jms:outbound-channel-adapter id="adapter"
    channel="jmsInput" destination-name="queueName">
</int-jms:outbound-channel-adapter>

更新了JMS出站代码

<int-jms:outbound-channel-adapter id="jms1"
		channel="jmsIn" destination-name="queueName">
		<int-jms:request-handler-advice-chain>
			<bean
				class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
				 <property name="onSuccessExpression" value="T(Boolean).TRUE" />
				<property name="successChannelName" value="afterSuccessDeleteChannel" />
			    <property name="onFailureExpression" value="T(Boolean).FALSE" />
				<property name="failureChannelName" value="afterFailRenameChannel" />
			</bean>
		</int-jms:request-handler-advice-chain>
	</int-jms:outbound-channel-adapter>

我的问题是

  • 如果服务类失败,我需要发送错误响应并停止流程
  • 如果服务方法成功持久化数据,但转换失败,系统1应该获得成功响应并记录错误。
  • 这里我在出站适配器中使用错误通道,即使变压器发生错误,它也会返回到系统1。
  • 请建议如何在不使用全局错误通道的情况下处理错误以及如何处理jms出站适配器中的错误。
    • 谢谢你回答我的问题

1 个答案:

答案 0 :(得分:0)

对于第一种情况,您应该真正依赖异常传播 - 流程停止并将错误作为HTTP响应发送到system1。

对于第二个(transformer)案例,您应该查看ExpressionEvaluatingRequestHandlerAdvice并将其与<request-handler-advice-chain> <transformer>一起使用。

如果你应该向system1承认,<int-jms:outbound-channel-adapter>可以应用同样的效果。

http://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#expression-advice

https://github.com/spring-projects/spring-integration-samples/tree/master/intermediate/retry-and-more