Spring Integration错误正在附加完成的有效负载

时间:2018-12-03 14:46:42

标签: java spring-integration spring-integration-dsl

我有一个JMS的侦听器。阅读消息后,我将转换为自定义对象

recyclerView = view.findViewById(R.id.recycler);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
adapter.addItems(paths);
adapter.notifyDataSetChanged();

变压器

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=

2 个答案:

答案 0 :(得分:1)

不确定在堆栈跟踪中丢失 _eventAggregator.GetEvent<<TfsHookEvent<WorkItemUpdatedPayload>>().Subscribe(WorkItem_Updated); 的商业目的是什么,但是可以通过抛出 private async Task WorkItem_Updated(WorkItemUpdatedPayload obj) { await CheckAsync(); } 而不是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()一起用于消息arg:

MessageHandlingException

答案 1 :(得分:0)

我遇到了几乎相同的问题,也许这可以为您提供帮助。如果您使用默认的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();
  }