在前面章节中,介绍了 Spring 集成 RabbitMQ。在使用 Spring 集成 RabbitMQ 时,我们用到了 <rabbit:template>、<rabbit:admin>、<rabbit:queue>、<rabbit:fanout-exchange> 等等元素,这些元素前面的 rabbit 命名空间是在配置文件前面进行声明的,声明方式如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-2.0.xsd"> <!-- 其他配置信息 --> </beans>
上面配置中,使用 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 进行了 rabbit 命名空间声明。
接下来,我们将分析一下 rabbit 常用的标签,Spring Rabbit Schema 文件下载地址:http://www.springframework.org/schema/rabbit/spring-rabbit-2.0.xsd
该标签用来创建一个 rabbit 模板(org.springframework.amqp.rabbit.core.RabbitTemplate),方便客户端访问 RabbitMQ,如发送消息等。该元素支持以下属性:
id:此 rabbit 模板的唯一名称,用作 bean 定义标识符;
routing-key:发送消息的默认路由键,默认为空;
exchange:发送消息的默认交换器,默认为空(默认交换器);
queue:接收消息的默认队列,默认为空(不存在的队列);
receive-timeout:接收操作超时时间(以毫秒为单位),“-1” 表示无限期等待,默认值为 0(立即超时)。
reply-timeout:发送和接收操作的超时时间(以毫秒为单位), 默认值为 5000(5 秒)。
channel-transacted:用于指示通道应以事务方式使用的标志,默认为 false。
encoding:用于打包和解包 String 类型的 MessageProperties 的编码,默认值为 UTF-8。
message-converter:MessageConverter 用于在 *Convert* 方法中的原始字节和Java对象之间进行转换。默认为处理字符串、字节数组和可序列化的简单实现。见 org.springframework.amqp.support.converter.MessageConverter 接口
connection-factory:引用 rabbit 连接工厂,org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
reply-queue:对回复的 <Queue/> 的引用;可选;如果未提供,则等待回复的方法将使用临时、独占、自动删除队列,或者,如果RabbitMQ版本为3.4或更高版本,则使用 “direct reply-to” 机制。另请参阅 ‘reply-address’ 和 ‘direct-reply-to-container’。见 org.springframework.amqp.core.Queue 类
direct-reply-to-container:当为 true(默认)时,直接回复将使用 DirectReplyToMessageListenerContainer' 来回复 sendAndReceive() 操作,从而允许重用消费者。设置为“false” 为每个请求创建(和取消)一个新的消费者。通过将回复队列保留为未指定或使用值 “amq.rabbitmq.reply-to” 来启用直接回复;它只能与 abbitMQ 3.4 或更高版本一起使用。如果为真,则不得提供“reply-listener” 子元素。
reply-address:回复寻址信息;默认情况下,回复将被路由到默认交换,使用 “reply-queue” 名称作为路由键;带有表格的地址 'exchange/routingKey' 表示回复将发布到指定的交换器并使用指定的路由键进行路由。“reply-address” 值优先于 “reply-queue” 值。'<reply-listener>' 必须配置为单独的 '<listener-container>' 组件,仅当 “reply-address” 正在使用中。'reply-address' 和 'reply-queue' 必须在逻辑上引用相同的队列,以实现正确的回复路由逻辑。
use-temporary-reply-queues:当为 “true” 时,指示模板为每个 “sendAndReceive” 使用一个临时的、独占的、自动删除队列。默认情况下,当没有 'reply-address' 时,模板将在 broker 支持的情况下使用 Direct reply-to ('http://www.rabbitmq.com/direct-reply-to.html')。 此标志覆盖该行为;如果提供了“reply-address”,则忽略它。 默认为 “false”。
mandatory:如果为‘true’,则在 basic.publish 上设置强制标志;仅当提供了 ‘return-callback’ 时才适用。与 “mandatory-expression” 互斥。默认为 ‘false’。
mandatory-expression:要针对每个请求消息计算的 Spel 表达式,以确定 “mandatory” 布尔值。BeanFactoryResolver 也是可用的,如果 RabbitTemplate 是从 Spring 上下文使用的,允许诸如 ‘@myBean.isMandatory(#root)’ 这样的表达式。仅当提供了 “return-callback” 时才适用。与 “mandatory” 互斥。
return-callback:对 RabbitTemplate.ReturnCallback 实现的引用 - 如果接收到使用 mandatory 发布的消息的返回,该消息无法根据该选项的语义传递。见 org.springframework.amqp.core.RabbitTemplate.ReturnCallback 接口
confirm-callback:对 RabbitTemplate.ConfirmCallback 实现的引用 - 如果收到已发布消息的确认(ack 或 nack)返回,则调用。需要将 “connection-factory” 的 “publisher-confirms” 设置为 “true”。见 org.springframework.amqp.core.RabbitTemplate.ConfirmCallback 接口
correlation-key:用于传送发送和接收操作的相关数据的标头名称。如果未指定,则使用标准的 correlationId消息属性。以前版本的 spring-amqp 使用标头 “spring_reply_correlation”;如果您希望继续使用该值,请在此处指定。
retry-template:对 RetryTemplate 的引用 - 用于调用 Rabbit 操作的重试(例如当连接失败时)。 默认情况下,不会尝试重试。见 org.springframework.retry.support.RetryTemplate 类
recovery-callback:对 RecoveryCallback 的引用 - 在 “retryTemplate.execute()” 中使用。如果未提供“重试模板”,则忽略。见 org.springframework.retry.RecoveryCallback 接口
send-connection-factory-selector-expression:当 “AbstractRoutingConnectionFactory” 用于此 “模板” 时,用于评估每个请求消息的 “lookupKey” 的 SpEL 表达式。如果从 Spring 上下文中使用 RabbitTemplate,则 “BeanFactoryResolver” 也可用,允许使用诸如 “@vhostFor.select(messageProperties.headers.customerId)” 之类的表达式。
receive-connection-factory-selector-expression:当 “AbstractRoutingConnectionFactory” 用于此“模板” 时,用于评估每个 “接收” 操作的 “lookupKey” 的 SpEL 表达式;评估的根对象是队列名称。如果从 Spring 上下文中使用 RabbitTemplate,则 “BeanFactoryResolver” 也可用,允许使用诸如 “@vhostFor.select(#root)” 之类的表达式。
user-id-expression:发送消息时评估 userId 属性的 SpEL 表达式,该属性仅在不存在时才会设置。评估的根对象是要发送的消息。见 https://www.rabbitmq.com/validated-user-id.html
创建一个 rabbit 管理员(org.springframework.amqp.rabbit.core.RabbitAdmin),用于管理交换、队列和绑定。该元素支持以下属性:
id:此 rabbit 管理员的唯一名称,用作 bean 定义标识符。
connection-factory:引用 rabbit 连接工厂,可以设置 “Connection-Factory” 或 “Template” 属性。
auto-startup:指定上下文中的队列、交换和绑定是否应该自动声明(当建立到代理的连接时延迟声明)。默认值为 ‘true’。
ignore-declaration-exceptions:如果启用了自动声明(请参见 “auto-startup”),如果将其设置为 “true”,则将记录异常(警告),但其他元素的声明将继续。如果为 false,则在发生异常时声明将停止。这是一个全局设置;也可以在单个元素上使用,默认值为 ‘false’。
为消费者创建一个队列(queue)以检索消息。如果代理上存在同名队列,则使用现有队列,否则声明一个新队列。如果您想发送消息,请使用交换器(exchange)。该元素支持以下属性:
id:如果队列ID与名称不同,则为该队列的ID。客户端可以通过引用队列本身或其名称来接收或侦听消息。
name:队列的名称。客户端可以通过引用队列本身或其名称来接收或侦听消息。如果未提供 “name”,则使用具有生成名称的 “AnonymousQueue”。
naming-strategy:如果没有提供 “name”,则使用命名策略来创建匿名队列名称。默认(未提供时)是 UUID 的字符串表示形式。要进行自定义,请提供对实现 “org.springframework.amqp.core.AnonymousQueue.NamingStrategy” 的 bean 的引用。
auto-delete:指示队列在不再使用时将被删除的标志,即声明它已关闭的连接,默认为 false。
exclusive:指示队列对此连接独占的标志,默认为 false。
durable:指示队列是持久的标志,这意味着它将在代理重新启动后仍然存在(不是其中的消息会,尽管如果它们是持久的,它们可能会),默认为 false。
queue-arguments:对 <queue-arguments/> 元素的引用。
声明此组件时要传递给代理的 Map。
为生产者创建 direct 类型的交换器来发送消息。如果它存在于代理上,则使用具有相同名称的现有交换器,或声明一个新交换器。当消息中的路由键与绑定中的键完全匹配时,直接交换器将消息路由到绑定到交换器的队列。您也可以在此处设置 <bindings>,使用显式路由键或隐式使用队列名称。
为生产者创建一个 fanout 类型的交换器来发送消息。如果它存在于代理上,则使用具有相同名称的现有交换器,或声明一个新交换器。fanout 类型交换器将消息路由到绑定到交换的所有队列,在该元素下面可以使用 <rabbit:bindings>、<rabbit:binding> 元素去绑定队列。
为生产者创建一个 topic 类型交换器来发送消息。如果它存在于代理上,则使用具有相同名称的现有交换器,或声明一个新交换器。当消息中的路由键与队列绑定中的路由模式匹配时,topic 交换器将消息路由到绑定到交换器的队列。您也可以在该元素下面可以使用 <rabbit:bindings>、<rabbit:binding> 元素去绑定队列。
为生产者创建一个 headers 类型交换器来发送消息。如果它存在于代理上,则使用具有相同名称的现有交换器,或声明一个新交换器。headers 类型的交换器将消息路由到消息标头与队列绑定中指定的标头匹配的所有队列。您也可以在该元素下面可以使用 <rabbit:bindings>、<rabbit:binding> 元素去绑定队列。
将队列绑定分组到交换器。
使用指定的路由模式将队列绑定到当前交换器上面,例如 “uk.weet.*” 或 “uk.#” 模式。该元素支持以下属性:
queue:要绑定到此交换器的队列的 Bean 名称。见 org.springframework.amqp.core.Queue 类
pattern:指定将队列绑定到此交换器的显式路由模式。在该模式中,符号 # 匹配一个或多个单词,符号 * 匹配任何单个单词。路由模式 “uk.#” 绑定所有以 uk 开头的路由键,“#.weather” 绑定所有以 weather 结尾的路由键,“uk.weather” 绑定所有路由键等于 “uk.weather” 的路由键(用于 <rabbit:topic-exchange> 元素)。
key:如果用于 <rabbit:direct-exchange> 元素,则表示将队列绑定到此交换的显式路由键。如果用于 <rabbit:headers-exchange> 元素,则表示与路由消息匹配的标头名称。此属性与 'binding-arguments' 子元素互斥。
value:与路由消息匹配的标头值,此属性与 'binding-arguments' 子元素互斥(用于 <rabbit:headers-exchange> 元素)。
每个 <listener> 子元素将由一个容器托管,该容器的配置由该父元素确定。此变体构建 RabbitMQ 侦听器容器,针对指定的 ConnectionFactory 进行操作。
定义一个监听器,该元素支持以下属性:
id:此侦听器的唯一标识符。将应用正常的 bean 名称覆盖 - 稍后使用相同 id 解析的侦听器将覆盖此 bean。
queue-names:此侦听器的队列名称为逗号分隔列表。
queues:此侦听器的队列(bean 引用)作为逗号分隔的列表。
exclusive:当为 true 时,容器中的单个消费者将独占使用队列,从而阻止其他消费者接收来自队列的消息。当为 true 时,需要并发 1。默认为 false。
priority:此侦听器的 Consumer 的优先级,需要 RabbitMQ 3.2 或更高版本。
ref:监听对象的bean名称,实现 MessageListener/ChannelAwareMessageListener 接口或者定义指定的监听方法,必需的。
method:要调用的侦听器方法的名称。如果未指定,则目标 bean 应该实现 MessageListener 或 ChannelAwareMessageListener 接口。
response-exchange:要向其发送响应消息的默认响应 Exchange 的名称。这将应用于不带有 “replyTo” 属性的请求消息的情况。 注意:这仅适用于具有返回值的侦听器方法,每个结果对象都将转换为响应消息。
response-routing-key:与响应消息一起发送的路由键。这将应用于不带有 “replyTo” 属性的请求消息的情况。注意:这仅适用于具有返回值的侦听器方法,每个结果对象都将转换为响应消息。
admin:参考 “RabbitAdmin”。如果侦听器正在使用自动删除队列并且这些队列配置为条件声明,则为必需。