当前位置: 首页 > 知识库问答 >
问题:

spring集成中的错误处理

岳硕
2023-03-14

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

<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将调用服务方法来持久化数据,如果请求有效,则返回响应,否则抛出异常

<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,只有当操作成功。调用服务方法后,根据服务方法响应,使用Transformer生成对系统3的请求。在transformer之后,我将请求放入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将获得成功响应,并记录错误。
  • 这里,由于我在出站适配器中使用错误通道,即使transformer中发生错误,它也会返回到系统1。
  • 请建议如何在不使用全局错误通道的情况下处理错误,以及如何在jms出站适配器中处理错误。
    • 谢谢你回答我的问题

共有1个答案

洪梓
2023-03-14

对于第一种情况,您实际上应该只依赖异常传播-流停止,错误作为HTTP响应发送到system1。

对于第二种情况(Transformer),您应该研究一下ExpressionEvaluatingRequestHandlerAdvise,并将其与 一起使用。

对于 ,如果您应该确认System1,也可以应用同样的方法。

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

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

 类似资料:
  • 场景可能是:我的期望可能是批量10个数据点,我想对{failed 5,pass 5}或其他什么给出响应。 我的逻辑是将批处理拆分为数据元素并进行验证 成功的验证将发送给aggreagtor, 失败的验证将抛出错误并通过错误通道拾取。 收件人列表路由器将错误通道作为输入通道,并连接2个过滤器,目的是过滤某些类型的错误直接发送响应(与用户输入无关的信息-服务器错误等),某些类型的客户端错误将转到聚合器

  • 在Spring integration中,我必须处理动态通道创建,但当我调试应用程序时,我看到不同通道之间的“阻塞”问题。 我知道是一个公共通道,在父上下文中共享,但如何为每个子上下文开发一个完整的独立场景?。公共网关是问题所在吗? 我在Spring integration flow async中看到了post错误处理,但对于每个子级,我都有一个完整的分离环境,我希望利用这些动态分离的优势。这可能

  • 问题内容: 我具有以下Spring Integration配置,该配置允许我从MVC Controller调用网关方法并让控制器返回,而集成流将在不阻塞控制器的单独线程中继续进行。 但是,我无法弄清楚如何使我的错误处理程序为该异步流工作。我的网关定义了错误通道,但是由于某种原因我的异常没有到达。相反,我看到被调用了。 网关: 为了查看我的错误处理程序正在处理的异步集成流程中发生的异常,我该怎么办?

  • 我有一个http inboundgateway,并定义了一个通往网关的错误通道。 异常消息StackTrace: 我在这里做错了什么?

  • 基础知识: 使用带集成的Spring 4.1.1,引导和1.0.0的DSL。 多个入站SFTP适配器在不同的时间表上从不同的供应商获取文件。 每个集成流在文件下载后将标头附加到消息中,以标识供应商源。 使用MessagePublishingErrorHandler处理异常。 标准消息流在消息处理成功或消息未能完成时通知外部监控解决方案。使用消息头来识别哪个流失败。 在我们收到消息后,成功和错误流都

  • 我如何处理在Spring整合中未能向Kafka传达的信息? 我在“int kafka:outbound channel adapter”中没有看到“error channel”是一个选项,我想知道应该在哪里添加错误通道信息,以便我的ErrorHandler可以获得“failed to kafka”类型的错误。(包括所有类型的故障、配置、网络等) 此外,inputToKafka是排队通道,我应该在哪