Gestion des exceptions communes RabbitMQ (marcher sur une fosse)

Exception 1: exception d'incompatibilité de méthode

Listener method 'no match' threw exceptionGlissez

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 在@RabbitListenerque lorsque cette annotation est libérée sur la classe, elle correspondra à la @RabbitHandlerméthode d'annotation en fonction du type de données . Le handlerparamètre d'entrée de ma méthode est le Longtype. Si l'entrée est le Stringtype, elle sera signalée Listener method 'no match' threw exceptionet 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 Longtype entrant ou le Stringtype soit traité, cette méthode est relativement stupide, il n'est pas recommandé d'utiliser

Solution 2 (recommandée):

Les @RabbitListenerannotations 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 rabbitmqle « 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 exceptionGlissez

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...cacheEnveloppez tout le code dans la méthode de surveillance et cacheajoutez 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

A publié 14 articles originaux · J'aime 39 · Plus de 120 000 visites

Je suppose que tu aimes

Origine blog.csdn.net/gozhuyinglong/article/details/105116090
conseillé
Classement