註解端點方法簽名

到目前為止,我們一直在我們的端點中注入一個簡單的 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;
    }
}