異常處理

預設情況下,如果一個帶註解的監聽器方法丟擲異常,該異常會被拋給容器,訊息會根據容器和代理的配置重新入隊、重新投遞、丟棄或路由到死信交換機。不會向傳送方返回任何內容。

從 2.0 版本開始,@RabbitListener 註解有兩個新屬性:errorHandlerreturnExceptions

這些屬性預設未配置。

您可以使用 errorHandler 來提供 RabbitListenerErrorHandler 實現的 bean 名稱。此函式式介面有一個方法,如下所示

@FunctionalInterface
public interface RabbitListenerErrorHandler {

    Object handleError(Message amqpMessage, org.springframework.messaging.Message<?> message,
              ListenerExecutionFailedException exception) throws Exception;

}

如您所見,您可以訪問從容器接收到的原始訊息、訊息轉換器生成的 spring-messaging Message<?> 物件,以及監聽器丟擲的異常(封裝在 ListenerExecutionFailedException 中)。錯誤處理器可以返回一些結果(作為回覆傳送)或丟擲原始異常或新異常(根據 returnExceptions 設定拋給容器或返回給傳送方)。

returnExceptions 屬性為 true 時,異常會返回給傳送方。異常被封裝在 RemoteInvocationResult 物件中。在傳送方,有一個可用的 RemoteInvocationAwareMessageConverterAdapter,如果將其配置到 RabbitTemplate 中,它會重新丟擲伺服器端異常,並將其封裝在 AmqpRemoteException 中。伺服器異常的堆疊跟蹤透過合併伺服器和客戶端堆疊跟蹤來合成。

此機制通常只適用於使用 Java 序列化的預設 SimpleMessageConverter。異常通常不“Jackson 友好”,無法序列化為 JSON。如果使用 JSON,請考慮在丟擲異常時使用 errorHandler 返回其他 Jackson 友好的 Error 物件。
在 2.1 版本中,此介面從包 o.s.amqp.rabbit.listener 移動到 o.s.amqp.rabbit.listener.api

從 2.1.7 版本開始,Channel 在訊息頭中可用;這允許您在使用 AcknowledgeMode.MANUAL 時對失敗的訊息進行確認或拒絕。

public Object handleError(Message amqpMessage, org.springframework.messaging.Message<?> message,
          ListenerExecutionFailedException exception) {
              ...
              message.getHeaders().get(AmqpHeaders.CHANNEL, Channel.class)
                  .basicReject(message.getHeaders().get(AmqpHeaders.DELIVERY_TAG, Long.class),
                               true);
          }

從 2.2.18 版本開始,如果丟擲訊息轉換異常,將呼叫錯誤處理器,其中 message 引數為 null。這允許應用程式向呼叫方傳送一些結果,指示收到了格式錯誤的訊息。以前,此類錯誤由容器丟擲和處理。

© . This site is unofficial and not affiliated with VMware.