帶註解端點方法簽章
到目前為止,我們一直在端點中注入簡單的 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;
}
}