帶註解端點方法簽章

到目前為止,我們一直在端點中注入簡單的 String,但它實際上可以具有非常彈性的方法簽章。以下範例將其重新撰寫,以注入具有自訂標頭的 Order

@Component
public class MyService {

    @RabbitListener(queues = "myQueue")
    public void processOrder(Order order, @Header("order_type") String orderType) {
        ...
    }
}

以下列表顯示可用於與監聽器端點中的參數匹配的引數

  • 原始 org.springframework.amqp.core.Message

  • 來自原始 MessageMessageProperties

  • 接收訊息的 com.rabbitmq.client.Channel

  • 從傳入的 AMQP 訊息轉換而來的 org.springframework.messaging.Message

  • @Header 註解的方法引數,用於擷取特定的標頭值,包括標準 AMQP 標頭。

  • @Headers 註解的引數,也必須可指派給 java.util.Map,才能存取所有標頭。

  • 轉換後的酬載

未註解且非支援類型之一 (即 MessageMessagePropertiesMessage<?>Channel) 的元素會與酬載匹配。您可以透過使用 @Payload 註解參數來明確表示。您也可以透過新增額外的 @Valid 來開啟驗證。

注入 Spring 的訊息抽象概念的能力特別有用,可以從傳輸特定的訊息中儲存的所有資訊中獲益,而無需依賴傳輸特定的 API。以下範例說明如何執行此操作

@RabbitListener(queues = "myQueue")
public void processOrder(Message<Order> order) { ...
}

方法引數的處理由 DefaultMessageHandlerMethodFactory 提供,您可以進一步自訂它以支援其他方法引數。轉換和驗證支援也可以在那裡自訂。

例如,如果我們想要確保我們的 Order 在處理之前是有效的,我們可以將酬載標註為 @Valid 並設定必要的驗證器,如下所示

@Configuration
@EnableRabbit
public class AppConfig implements RabbitListenerConfigurer {

    @Override
    public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
        registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory());
    }

    @Bean
    public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() {
        DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
        factory.setValidator(myValidator());
        return factory;
    }
}