帶註解的端點方法簽名
到目前為止,我們一直在端點中注入一個簡單的 String,但它實際上可以有一個非常靈活的方法簽名。以下示例將其重寫為注入帶有自定義頭的 Order
@Component
public class MyService {
@RabbitListener(queues = "myQueue")
public void processOrder(Order order, @Header("order_type") String orderType) {
...
}
}
以下列表顯示了可在偵聽器端點中與引數匹配的引數
-
原始的
org.springframework.amqp.core.Message。 -
原始
Message中的MessageProperties。 -
接收到訊息的
com.rabbitmq.client.Channel。 -
從傳入的 AMQP 訊息轉換而來的
org.springframework.messaging.Message。 -
帶有
@Header註解的方法引數,用於提取特定的頭值,包括標準 AMQP 頭。 -
帶有
@Headers註解的引數,它還必須可分配給java.util.Map以訪問所有頭。 -
轉換後的負載
未註解且不屬於支援型別(即 Message、MessageProperties、Message<?> 和 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;
}
}