对于最新稳定版本,请使用Spring AMQP 4.0.0spring-doc.cadn.net.cn

注释驱动监听器端点

异步接收消息最简单的方法是使用带注释的监听器端点基础设施。 简而言之,它允许你将管理豆的方法暴露为兔子监听器端点。 以下示例展示了如何使用@RabbitListener注解:spring-doc.cadn.net.cn

@Component
public class MyService {

    @RabbitListener(queues = "myQueue")
    public void processOrder(String data) {
        ...
    }

}

前述示例的思想是,每当队列中有消息时,名为我的队列进程顺序方法会相应地调用(此例中,是消息的有效载荷)。spring-doc.cadn.net.cn

注释端点基础设施在幕后为每个注释方法创建一个消息监听器容器,通过使用兔子听众容器工厂.spring-doc.cadn.net.cn

在上述例子中,我的队列必须已经存在并与某种交换绑定。 只要兔子管理员存在于应用上下文中。spring-doc.cadn.net.cn

属性占位符(${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命名策略. 你无法用这种技术声明经纪人命名队列;它们需要被声明为豆子定义;参见容器和经纪人命名队列。 倍数队列绑定可以提供条目,让监听者可以同时听多个队列。 在第三个例子中,一个名为 的队列从 属性中检索我的.队列如有必要,会声明,默认绑定为默认交换,使用队列名称作为路由密钥。spring-doc.cadn.net.cn

自2.0版本起,@Exchange注释支持任何交换类型,包括自定义。 更多信息请参见AMQP概念spring-doc.cadn.net.cn

你可以用普通@Bean需要更高级配置时的定义。spring-doc.cadn.net.cn

通知ignoreDeclarationExceptions在第一个例子中的交换中。 例如,这允许绑定到可能有不同设置的现有交易所(例如内部). 默认情况下,现有交易所的属性必须匹配。spring-doc.cadn.net.cn

从2.0版本开始,你可以将队列绑定到拥有多个路由密钥的交换机,如下示例所示:spring-doc.cadn.net.cn

...
    key = { "red", "yellow" }
...

你也可以在@QueueBinding队列、交换的注释, 以及绑定,如下示例所示:spring-doc.cadn.net.cn

@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)论证意味着必须满足这两个条件。spring-doc.cadn.net.cn

参数名称、值和类型可以是属性占位符(${…​})或SpEL表达式(#{…​}). 这名称必须解析为字符串. 表达式类型必须解析为或者是类别的完全限定名称。 这必须解决为可通过DefaultConversionService到类型(例如:x-message-ttl在前面的例子中)。spring-doc.cadn.net.cn

如果一个名称解析为或者空的字符串@Argument被忽视了。spring-doc.cadn.net.cn