在Spring Integration中处理exception时遇到问题

我是Spring集成的新手,对于如何将错误消息发送到指定的错误队列感到困惑。 我希望错误消息是原始消息上的标头,并最终在一个单独的队列中。 我读到这可以通过标头扩充器来完成,我尝试实现但没有出现在错误队列中。

另外,我是否需要一个单独的exception处理类,以便将错误消息发送到错误队列,或者我可以在转换方法中抛出exception?

这是我的xml配置:

                        

   

               

错误类:

 public class ErrorHandler { public String errorHandle(MessageHandlingException exception) { return exception.getMessage(); 

QualityScorer类(由变换器调用):

 public class QualityScorer { private Hashtable table; private final static String csvFile = "C:\\Users\\john\\Test.csv"; public QualityScorer() throws Exception { table = new Hashtable(); initializeTable(); } private void initializeTable() throws Exception { BufferedReader br = null; String line = ""; String cvsSplitBy = ","; try { br = new BufferedReader(new FileReader(csvFile)); while ((line = br.readLine()) != null) { String[] data = line.split(cvsSplitBy); if(data.length > 6 && data[1].equals("1") && data[4].equals("0") && data[5].equals("1")) table.putIfAbsent(data[3], data[1]); } } catch (FileNotFoundException e) { throw new Exception("No file found"); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } } public float getScore(JSONObject object) throws Exception { float score; if (object == null) { throw new IllegalArgumentException("object"); } if (!object.has("source")) { throw new Exception("Object does not have a source"); } if (!object.has("employer")) { throw new Exception("Object does not have an employer"); } String source = object.getString("Source"); String employer = object.getString("employer"); if (table.containsKey(employer) && !source.equals("packageOne")) { score = 1; } else { score = -1; } return score; } } 

现在,正在加载的消息没有源代码,因此程序应该将MessagingException抛给MessageErrorHandler。

变压器代码:

 public class Transformer { private QualityScorer qualityScorer; public Transformer() throws Exception { qualityScorer = new QualityScorer(); } public JSONObject transform(JSONObject object) throws Exception { float score = qualityScorer.getScore(object); object.put("score", score); return object; } } 

总之,程序应该从队列接收预先加载的消息,对其进行转换并将其发送到第二个队列,如果在预加载的消息中提供了源,则它会成功。 我正在尝试处理错误并将其作为消息头发送到错误队列。 这个问题让我感到沮丧一段时间,所以非常感谢帮助!

stacktrace中当前显示的错误是:

 java.lang.NoSuchMethodError: org.springframework.messaging.MessageHandlingException: method (Lorg/springframework/messaging/Message;Ljava/lang/Throwable;)V not found at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:96) at org.springframework.integration.handler.ServiceActivatingHandler.handleRequestMessage(ServiceActivatingHandler.java:89) at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109) at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) at org.springframework.integration.handler.MessageHandlerChain$1.send(MessageHandlerChain.java:129) at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:114) at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:44) at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:92) at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:358) at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:269) at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:186) at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:115) at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) at org.springframework.integration.handler.MessageHandlerChain$1.send(MessageHandlerChain.java:129) at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:114) at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:44) at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:92) at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:358) at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:269) at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:186) at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:115) at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) at org.springframework.integration.handler.MessageHandlerChain.handleMessageInternal(MessageHandlerChain.java:110) at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148) at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121) at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89) at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423) at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373) at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:114) at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:44) at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:92) at org.springframework.integration.endpoint.MessageProducerSupport.sendMessage(MessageProducerSupport.java:188) at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter.access$1100(AmqpInboundChannelAdapter.java:56) at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.processMessage(AmqpInboundChannelAdapter.java:246) at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.onMessage(AmqpInboundChannelAdapter.java:203) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:822) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:745) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:97) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:189) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1276) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:726) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1219) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1189) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1500(SimpleMessageListenerContainer.java:97) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1421) at java.lang.Thread.run(Thread.java:748) 

但没有任何东西会进入错误队列。

抛出exception时,它会与requestMessage一起包装到MessagingException 。 您自己的业务exception位于cause ,您可以从MessagingException.failedMessage属性访问requestMessage

所以,看起来你拥有了用例所需的一切。 只有在发送到error-exchange你真的应该在错误流中有一些来正确地将MessagingException转换为发送到AMQP的正确消息的问题。