Spring 集成错误正在附加完整的负载
Spring Integration error is attaching completed payload
我有一个 JMS 监听器。阅读消息后,我将转换为自定义对象
public IntegrationFlow queueProcessorFlow() {
return IntegrationFlows.from(Jms.inboundAdapter(jmsTemplate)
.destination("test_queue"),
c -> c.poller(Pollers.fixedDelay(5000L)
.maxMessagesPerPoll(1)))
//convert json to our custom object
.transform(new JsonToQueueEventConverterTransformer(springBeanFactory))
.transform(new CustomTransformer(springBeanFactory))
.handle(o -> {
}).get();
}
变形金刚
public class CustomerTransformer implements GenericTransformer<CustomPojo, CustomPojo> {
private final QueueDataProcessorSpringBeanFactory factory;
@Override
public CustomPojo transform(CustomPojo CustomPojo) {
try {
//do something e.g. service call
throw new Exception("This failed mate !! SOS");
} catch (Exception e) {
//ISSUE here
//e contains the original payload in the stack trace
throw new RuntimeException(e);
}
return CustomPojo;
}
现在,当我抛出自定义异常时,堆栈跟踪包含所有内容。它甚至包含有效载荷。我对有效载荷不感兴趣,以防出现异常。
如何更新以不包含负载?
** 更新 **
根据答案更改后我仍然看到问题
org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessageHandlingException: nested exception is org.springframework.integration.transformer.MessageTransformationException: Error initiliazing the :; nested exception is CustomException Error lab lab lab , failedMessage=GenericMessage [payload=
我的错误处理程序
@Bean
public IntegrationFlow errorHandlingFlow() {
return IntegrationFlows.from("errorChannel")
.handle(message -> {
try {
ErrorMessage e = (ErrorMessage) message;
if (e.getPayload() instanceof MessageTransformationException) {
String stackTrace = ExceptionUtils.getStackTrace(e.getPayload());
LOG.info("Exception trace {} ", stackTrace);
不确定在堆栈跟踪中丢失 payload
的业务目的是什么,但您可以实现抛出 MessageTransformationException
而不是 RuntimeException
.
要避免在堆栈跟踪中出现具有上述负载的消息,您需要使用以下构造函数之一:
public MessageTransformationException(String description, Throwable cause) {
super(description, cause);
}
public MessageTransformationException(String description) {
super(description);
}
而不是基于 Message<?>
的那些。
这样包装 MessageTransformingHandler
将执行适当的逻辑:
protected Object handleRequestMessage(Message<?> message) {
try {
return this.transformer.transform(message);
}
catch (Exception e) {
if (e instanceof MessageTransformationException) {
throw (MessageTransformationException) e;
}
throw new MessageTransformationException(message, "Failed to transform Message", e);
}
}
更新
事实证明 MessageTransformationException
是不够的,因为 AbstractMessageHandler
检查 MessageHandlingException
以便在 IntegrationUtils.wrapInHandlingExceptionIfNecessary()
中换行。因此,我建议改为从您的代码中抛出一个 MessageHandlingException
。并将此构造函数与 null
一起用于消息 arg:
MessageHandlingException(Message<?> failedMessage, Throwable cause)
我遇到了几乎相同的问题,也许这可以帮助你。如果您使用默认的 errorChannel
Bean,这已经订阅了一个 LoggingHandler
打印完整消息,如果您想避免打印有效负载,您可以通过这种方式创建自己的 errorChannel
您将覆盖默认行为
@Bean
@Qualifier(IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)
public MessageChannel errorChannel() {
return new PublishSubscribeChannel();
}
如果您的问题是在使用 .log()
处理程序时,您始终可以使用一个函数来决定要显示消息的哪一部分
@Bean
public IntegrationFlow errorFlow(IntegrationFlow
createOutFileInCaseErrorFlow) {
return
IntegrationFlows.from(IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)
.log(LoggingHandler.Level.ERROR, m -> m.getHeaders())
.<MessagingException>log(Level.ERROR, p -> p.getPayload().getMessage())
.get();
}
我有一个 JMS 监听器。阅读消息后,我将转换为自定义对象
public IntegrationFlow queueProcessorFlow() {
return IntegrationFlows.from(Jms.inboundAdapter(jmsTemplate)
.destination("test_queue"),
c -> c.poller(Pollers.fixedDelay(5000L)
.maxMessagesPerPoll(1)))
//convert json to our custom object
.transform(new JsonToQueueEventConverterTransformer(springBeanFactory))
.transform(new CustomTransformer(springBeanFactory))
.handle(o -> {
}).get();
}
变形金刚
public class CustomerTransformer implements GenericTransformer<CustomPojo, CustomPojo> {
private final QueueDataProcessorSpringBeanFactory factory;
@Override
public CustomPojo transform(CustomPojo CustomPojo) {
try {
//do something e.g. service call
throw new Exception("This failed mate !! SOS");
} catch (Exception e) {
//ISSUE here
//e contains the original payload in the stack trace
throw new RuntimeException(e);
}
return CustomPojo;
}
现在,当我抛出自定义异常时,堆栈跟踪包含所有内容。它甚至包含有效载荷。我对有效载荷不感兴趣,以防出现异常。
如何更新以不包含负载?
** 更新 **
根据答案更改后我仍然看到问题
org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessageHandlingException: nested exception is org.springframework.integration.transformer.MessageTransformationException: Error initiliazing the :; nested exception is CustomException Error lab lab lab , failedMessage=GenericMessage [payload=
我的错误处理程序
@Bean
public IntegrationFlow errorHandlingFlow() {
return IntegrationFlows.from("errorChannel")
.handle(message -> {
try {
ErrorMessage e = (ErrorMessage) message;
if (e.getPayload() instanceof MessageTransformationException) {
String stackTrace = ExceptionUtils.getStackTrace(e.getPayload());
LOG.info("Exception trace {} ", stackTrace);
不确定在堆栈跟踪中丢失 payload
的业务目的是什么,但您可以实现抛出 MessageTransformationException
而不是 RuntimeException
.
要避免在堆栈跟踪中出现具有上述负载的消息,您需要使用以下构造函数之一:
public MessageTransformationException(String description, Throwable cause) {
super(description, cause);
}
public MessageTransformationException(String description) {
super(description);
}
而不是基于 Message<?>
的那些。
这样包装 MessageTransformingHandler
将执行适当的逻辑:
protected Object handleRequestMessage(Message<?> message) {
try {
return this.transformer.transform(message);
}
catch (Exception e) {
if (e instanceof MessageTransformationException) {
throw (MessageTransformationException) e;
}
throw new MessageTransformationException(message, "Failed to transform Message", e);
}
}
更新
事实证明 MessageTransformationException
是不够的,因为 AbstractMessageHandler
检查 MessageHandlingException
以便在 IntegrationUtils.wrapInHandlingExceptionIfNecessary()
中换行。因此,我建议改为从您的代码中抛出一个 MessageHandlingException
。并将此构造函数与 null
一起用于消息 arg:
MessageHandlingException(Message<?> failedMessage, Throwable cause)
我遇到了几乎相同的问题,也许这可以帮助你。如果您使用默认的 errorChannel
Bean,这已经订阅了一个 LoggingHandler
打印完整消息,如果您想避免打印有效负载,您可以通过这种方式创建自己的 errorChannel
您将覆盖默认行为
@Bean
@Qualifier(IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)
public MessageChannel errorChannel() {
return new PublishSubscribeChannel();
}
如果您的问题是在使用 .log()
处理程序时,您始终可以使用一个函数来决定要显示消息的哪一部分
@Bean
public IntegrationFlow errorFlow(IntegrationFlow
createOutFileInCaseErrorFlow) {
return
IntegrationFlows.from(IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)
.log(LoggingHandler.Level.ERROR, m -> m.getHeaders())
.<MessagingException>log(Level.ERROR, p -> p.getPayload().getMessage())
.get();
}