该版本仍在开发中,尚未被视为稳定。请使用最新的稳定版本,使用 Spring AMQP 4.0.0!spring-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命名策略. 你不能用这种技术声明经纪人命名队列;它们需要声明为 bean 定义;参见容器和经纪人命名队列。 倍数队列绑定可以提供条目,使监听者可以监听多个队列。在第三个例子中,一个名为 的队列从属性中检索我的.队列如有必要,会声明,默认绑定为默认交换,使用队列名称作为路由密钥。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