我有一个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=
答案 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();
}