|
对于最新稳定版本,请使用Spring AMQP 4.0.0! |
注释驱动监听器端点
异步接收消息最简单的方法是使用带注释的监听器端点基础设施。
简而言之,它允许你将管理豆的方法暴露为兔子监听器端点。
以下示例展示了如何使用@RabbitListener注解:
@Component
public class MyService {
@RabbitListener(queues = "myQueue")
public void processOrder(String data) {
...
}
}
前述示例的思想是,每当队列中有消息时,名为我的队列这进程顺序方法会相应地调用(此例中,是消息的有效载荷)。
注释端点基础设施在幕后为每个注释方法创建一个消息监听器容器,通过使用兔子听众容器工厂.
在上述例子中,我的队列必须已经存在并与某种交换绑定。
只要兔子管理员存在于应用上下文中。
属性占位符(${some.property})或SpEL表达式(#{某种表情}可以指定注释性质(队列等等)。
请参见“听多队列”一文,说明为什么你可以用 SpEL 代替属性占位符。
以下列表展示了三种如何声明兔子监听者的示例: |
@Component
public class MyService {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "myQueue", durable = "true"),
exchange = @Exchange(value = "auto.exch", ignoreDeclarationExceptions = "true"),
key = "orderRoutingKey")
)
public void processOrder(Order order) {
...
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue,
exchange = @Exchange(value = "auto.exch"),
key = "invoiceRoutingKey")
)
public void processInvoice(Invoice invoice) {
...
}
@RabbitListener(queuesToDeclare = @Queue(name = "${my.queue}", durable = "true"))
public String handleWithSimpleDeclare(String data) {
...
}
}
在第一个例子中,队列我的队列在交换过程中自动声明(持久性),如有需要,
并用路由密钥绑定到交换机。
第二个例子中,声明并绑定了一个匿名(排他、自动删除)队列;队列名称由框架通过Base64Url命名策略.
你无法用这种技术声明经纪人命名队列;它们需要被声明为豆子定义;参见容器和经纪人命名队列。
倍数队列绑定可以提供条目,让监听者可以同时听多个队列。
在第三个例子中,一个名为 的队列从 属性中检索我的.队列如有必要,会声明,默认绑定为默认交换,使用队列名称作为路由密钥。
自2.0版本起,@Exchange注释支持任何交换类型,包括自定义。
更多信息请参见AMQP概念。
你可以用普通@Bean需要更高级配置时的定义。
通知ignoreDeclarationExceptions在第一个例子中的交换中。
例如,这允许绑定到可能有不同设置的现有交易所(例如内部).
默认情况下,现有交易所的属性必须匹配。
从2.0版本开始,你可以将队列绑定到拥有多个路由密钥的交换机,如下示例所示:
...
key = { "red", "yellow" }
...
你也可以在@QueueBinding队列、交换的注释,
以及绑定,如下示例所示:
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "auto.headers", autoDelete = "true",
arguments = @Argument(name = "x-message-ttl", value = "10000",
type = "java.lang.Integer")),
exchange = @Exchange(value = "auto.headers", type = ExchangeTypes.HEADERS, autoDelete = "true"),
arguments = {
@Argument(name = "x-match", value = "all"),
@Argument(name = "thing1", value = "somevalue"),
@Argument(name = "thing2")
})
)
public String handleWithHeadersExchange(String foo) {
...
}
注意x-message-ttl参数为队列的10秒。
因为参数类型不是字符串,我们必须指定其类型——在此例中,整数.
与所有此类声明一样,如果队列已经存在,参数必须匹配队列中的参数。
对于头部交换,我们设置绑定参数以匹配具有东西1头部设置为某种值和
这东西2头必须包含任意值。
这X-match(X-match)论证意味着必须满足这两个条件。
参数名称、值和类型可以是属性占位符(${…})或SpEL表达式(#{…}).
这名称必须解析为字符串.
表达式类型必须解析为类或者是类别的完全限定名称。
这值必须解决为可通过DefaultConversionService到类型(例如:x-message-ttl在前面的例子中)。
如果一个名称解析为零或者空的字符串那@Argument被忽视了。