Exception 1: exception d'incompatibilité de méthode
Listener method 'no match' threw exception
Glissez
2020-03-26 11:00:07.747 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1] WARN org.springframework.amqp.rabbit.listener.ConditionalRejectingErrorHandler.log(117) - Execution of Rabbit message listener failed.
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'no match' threw exception
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:204)
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:129)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.amqp.AmqpException: No method found for class [B
at org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler.getHandlerForPayload(DelegatingInvocableHandler.java:149)
at org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler.invoke(DelegatingInvocableHandler.java:129)
at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:61)
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:196)
... 12 common frames omitted
Mon code d'abord:
@Slf4j
@Component
@RabbitListener(queues = "mall.order.cancel")
public class CancelOrderReceiver {
@Autowired
private OmsPortalOrderService portalOrderService;
@Resource
private CancelOrderSender cancelOrderSender;
@RabbitHandler
public void handler(Long orderId){
try {
log.info("process orderId:{}", orderId);
portalOrderService.cancelOrder(orderId);
} catch (Exception e) {
log.error(ExceptionUtils.getStackTrace(e));
// 异常处理
cancelOrderSender.sendFailedMessage(orderId);
}
}
}
Pourquoi y a-t-il un décalage de méthode? La raison en est 在@RabbitListener
que lorsque cette annotation est libérée sur la classe, elle correspondra à la @RabbitHandler
méthode d'annotation en fonction du type de données . Le handler
paramètre d'entrée de ma méthode est le Long
type. Si l'entrée est le String
type, elle sera signalée Listener method 'no match' threw exception
et le problème sera détecté (mécanisme de requeue RabbitMQ) , La solution est donnée ci-dessous:
Solution 1:
Ajoutez une autre handler(String orderId)
méthode, que le Long
type entrant ou le String
type soit traité, cette méthode est relativement stupide, il n'est pas recommandé d'utiliser
Solution 2 (recommandée):
Les @RabbitListener
annotations placées sur la méthode, le code suivant:
@Slf4j
@Component
public class CancelOrderReceiver {
@Autowired
private OmsPortalOrderService portalOrderService;
@Resource
private CancelOrderSender cancelOrderSender;
@RabbitHandler
@RabbitListener(queues = "mall.order.cancel")
public void handler(Long orderId){
try {
log.info("process orderId:{}", orderId);
portalOrderService.cancelOrder(orderId);
} catch (Exception e) {
log.error(ExceptionUtils.getStackTrace(e));
// 异常处理
cancelOrderSender.sendFailedMessage(orderId);
}
}
}
Donc, quel que soit le type de données que vous transmettez, vous entrerez dans cette méthode, ne vous inquiétez pas de rafraîchir l'écran. Bien sûr, si le type entrant ne correspond pas, une erreur sera signalée. Par conséquent, il est très nécessaire de contraindre le type de données avec l'expéditeur consommateur.
Solution 3:
Sera rabbitmq
le « requeue » configuré false
. Cette méthode est simple et approximative, mais l'exception n'est pas facile à détecter et la gestion des exceptions suivantes est difficile
Exception 2: exception dans la méthode de surveillance
Listener method '***' threw exception
Glissez
2020-03-26 11:46:22.789 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] WARN org.springframework.amqp.rabbit.listener.ConditionalRejectingErrorHandler.log(117) - Execution of Rabbit message listener failed.
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'public void com.macro.mall.portal.component.CancelOrderReceiver.handler(java.lang.Long)' threw exception
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:204)
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:129)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NumberFormatException: For input string: "嘿嘿嘿"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at com.macro.mall.portal.component.CancelOrderReceiver.handler(CancelOrderReceiver.java:31)
at sun.reflect.GeneratedMethodAccessor122.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)
at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:50)
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:196)
... 12 common frames omitted
Regardez mon code:
@RabbitHandler
@RabbitListener(queues = "mall.order.cancel")
public void handler(Long orderId){
Integer.parseInt("嘿嘿嘿"); // 演示异常使用
try {
log.info("process orderId:{}", orderId);
portalOrderService.cancelOrder(orderId);
} catch (Exception e) {
log.error(ExceptionUtils.getStackTrace(e));
// 异常处理
cancelOrderSender.sendFailedMessage(orderId);
}
}
De toute évidence, une Integer.parseInt("嘿嘿嘿")
erreur sera signalée, entraînant une actualisation anormale de l'écran
Solution:
try...cache
Enveloppez tout le code dans la méthode de surveillance et cache
ajoutez la gestion des exceptions dans le code suivant:
@RabbitHandler
@RabbitListener(queues = "mall.order.cancel")
public void handler(Long orderId){
try {
Integer.parseInt("嘿嘿嘿"); // 演示异常使用
log.info("process orderId:{}", orderId);
portalOrderService.cancelOrder(orderId);
} catch (Exception e) {
log.error(ExceptionUtils.getStackTrace(e));
// 异常处理
cancelOrderSender.sendFailedMessage(orderId);
}
}
Écrivez tellement d'abord et continuez à mettre à jour si vous rencontrez des problèmes à l'avenir. Si vous avez un bon plan, veuillez laisser un message et apprendre ensemble et progresser ensemble