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();
  }