发送消息时,可以使用以下任一方法:Spring中文文档

void send(Message message) throws AmqpException;

void send(String routingKey, Message message) throws AmqpException;

void send(String exchange, String routingKey, Message message) throws AmqpException;

我们可以从前面列表中的最后一个方法开始讨论,因为它实际上是最明确的。 它允许在运行时提供 AMQP 交换名称(以及路由密钥)。 最后一个参数是负责实际创建消息实例的回调。 使用此方法发送消息的示例可能如下所示: 下面的示例演示如何使用该方法发送消息:sendSpring中文文档

amqpTemplate.send("marketData.topic", "quotes.nasdaq.THING1",
    new Message("12.34".getBytes(), someProperties));

如果您计划大部分时间或所有时间使用该模板实例发送到同一交易所,则可以在模板本身上设置该属性。 在这种情况下,您可以使用前面列表中的第二种方法。 以下示例在功能上等同于上一个示例:exchangeSpring中文文档

amqpTemplate.setExchange("marketData.topic");
amqpTemplate.send("quotes.nasdaq.FOO", new Message("12.34".getBytes(), someProperties));

如果在模板上同时设置了 和 属性,则可以使用仅接受 . 以下示例演示如何执行此操作:exchangeroutingKeyMessageSpring中文文档

amqpTemplate.setExchange("marketData.topic");
amqpTemplate.setRoutingKey("quotes.nasdaq.FOO");
amqpTemplate.send(new Message("12.34".getBytes(), someProperties));

考虑交换和路由键属性的更好方法是,显式方法参数始终覆盖模板的默认值。 事实上,即使您没有在模板上显式设置这些属性,也始终存在默认值。 在这两种情况下,默认值都是空的,但这实际上是一个合理的默认值。 就路由键而言,它并不总是首先必需的(例如,对于 交换)。 此外,队列可以绑定到具有空 . 这些都是依赖模板的路由键属性的默认空值的合法方案。 就交换名称而言,通常使用空名称,因为 AMQP 规范将“默认交换”定义为没有名称。 由于所有队列都自动绑定到该默认交换(即直接交换),使用其名称作为绑定值,因此上一列表中的第二种方法可用于通过默认交换向任何队列发送简单的点对点消息。 您可以通过在运行时提供 method 参数来提供队列名称作为 。 以下示例演示如何执行此操作:StringFanoutStringStringStringroutingKeySpring中文文档

RabbitTemplate template = new RabbitTemplate(); // using default no-name Exchange
template.send("queue.helloWorld", new Message("Hello World".getBytes(), someProperties));

或者,您可以创建一个模板,该模板可用于主要或专门发布到单个队列。 以下示例演示如何执行此操作:Spring中文文档

RabbitTemplate template = new RabbitTemplate(); // using default no-name Exchange
template.setRoutingKey("queue.helloWorld"); // but we'll always send to this Queue
template.send(new Message("Hello World".getBytes(), someProperties));

消息生成器 API

从版本 1.3 开始,消息生成器 API 由 和 提供。 这些方法提供了一种方便的“流畅”方法来创建消息或消息属性。 以下示例显示了 Fluent API 的实际应用:MessageBuilderMessagePropertiesBuilderSpring中文文档

Message message = MessageBuilder.withBody("foo".getBytes())
    .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
    .setMessageId("123")
    .setHeader("bar", "baz")
    .build();
MessageProperties props = MessagePropertiesBuilder.newInstance()
    .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
    .setMessageId("123")
    .setHeader("bar", "baz")
    .build();
Message message = MessageBuilder.withBody("foo".getBytes())
    .andProperties(props)
    .build();

可以设置在 MessageProperties 上定义的每个属性。 其他方法包括 、 、 和 。 每个属性设置方法都有一个变体。 如果存在默认初始值,则该方法被命名为 。setHeader(String key, String value)removeHeader(String key)removeHeaders()copyProperties(MessageProperties properties)set*IfAbsent()set*IfAbsentOrDefault()Spring中文文档

提供了五种静态方法来创建初始消息生成器:Spring中文文档

public static MessageBuilder withBody(byte[] body) (1)

public static MessageBuilder withClonedBody(byte[] body) (2)

public static MessageBuilder withBody(byte[] body, int from, int to) (3)

public static MessageBuilder fromMessage(Message message) (4)

public static MessageBuilder fromClonedMessage(Message message) (5)
1 生成器创建的消息具有直接引用参数的正文。
2 生成器创建的消息具有一个正文,该正文是一个新数组,其中包含参数中的字节副本。
3 生成器创建的消息具有一个正文,该正文是一个新数组,其中包含参数中的字节范围。 有关更多详细信息,请参阅 Arrays.copyOfRange()。
4 生成器创建的消息具有一个正文,该正文直接引用参数的正文。 参数的属性将复制到新对象。MessageProperties
5 生成器创建的消息具有一个正文,该正文是一个包含参数正文副本的新数组。 参数的属性将复制到新对象。MessageProperties

提供了三种静态方法来创建实例:MessagePropertiesBuilderSpring中文文档

public static MessagePropertiesBuilder newInstance() (1)

public static MessagePropertiesBuilder fromProperties(MessageProperties properties) (2)

public static MessagePropertiesBuilder fromClonedProperties(MessageProperties properties) (3)
1 使用默认值初始化新的消息属性对象。
2 生成器使用提供的属性对象进行初始化,并将返回该对象。build()
3 参数的属性将复制到新对象。MessageProperties

通过实现 ,每个方法都有一个重载版本,该版本采用一个附加对象。 启用发布者确认后,将在 AmqpTemplate 中所述的回调中返回此对象。 这允许发送者将确认(或)与发送的消息相关联。RabbitTemplateAmqpTemplatesend()CorrelationDataacknackSpring中文文档

从版本 1.6.7 开始,引入了该接口,允许在消息转换后修改相关数据。 以下示例演示如何使用它:CorrelationAwareMessagePostProcessorSpring中文文档

Message postProcessMessage(Message message, Correlation correlation);

在 V2.0 中,不推荐使用此接口。 该方法已移至委托给 的默认实现。MessagePostProcessorpostProcessMessage(Message message)Spring中文文档

同样从版本 1.6.7 开始,提供了一个名为的新回调接口。 这是在所有实例(在方法中提供)以及 中提供的实例之后调用的。 实现可以更新或替换方法中提供的关联数据(如果有)。 和 original(如果有)作为参数提供。 下面的示例演示如何使用该方法:CorrelationDataPostProcessorMessagePostProcessorsend()setBeforePublishPostProcessors()send()MessageCorrelationDatapostProcessSpring中文文档

CorrelationData postProcess(Message message, CorrelationData correlationData);
1 生成器创建的消息具有直接引用参数的正文。
2 生成器创建的消息具有一个正文,该正文是一个新数组,其中包含参数中的字节副本。
3 生成器创建的消息具有一个正文,该正文是一个新数组,其中包含参数中的字节范围。 有关更多详细信息,请参阅 Arrays.copyOfRange()。
4 生成器创建的消息具有一个正文,该正文直接引用参数的正文。 参数的属性将复制到新对象。MessageProperties
5 生成器创建的消息具有一个正文,该正文是一个包含参数正文副本的新数组。 参数的属性将复制到新对象。MessageProperties
1 使用默认值初始化新的消息属性对象。
2 生成器使用提供的属性对象进行初始化,并将返回该对象。build()
3 参数的属性将复制到新对象。MessageProperties

发布者返回

当模板的属性为 时,返回的消息由 AmqpTemplate 中所述的回调提供。mandatorytrueSpring中文文档

从版本 1.4 开始,支持 SpEL 属性,该属性作为根评估对象针对每个请求消息进行评估,解析为值。 可以在表达式中使用 Bean 引用,例如 。RabbitTemplatemandatoryExpressionboolean@myBean.isMandatory(#root)Spring中文文档

发布者返回也可以由发送和接收操作在内部使用。 有关详细信息,请参阅回复超时RabbitTemplateSpring中文文档

配料

版本 1.4.2 引入了 . 这是一个子类,具有一个重写的方法,该方法根据 . 只有当批处理完成时,消息才会发送到 RabbitMQ。 以下列表显示了接口定义:BatchingRabbitTemplateRabbitTemplatesendBatchingStrategyBatchingStrategySpring中文文档

public interface BatchingStrategy {

    MessageBatch addToBatch(String exchange, String routingKey, Message message);

    Date nextRelease();

    Collection<MessageBatch> releaseBatches();

}
批处理数据保存在内存中。 如果发生系统故障,未发送的消息可能会丢失。

提供了 A。 它支持将消息发送到单个交换密钥或路由密钥。 它具有以下属性:SimpleBatchingStrategySpring中文文档

  • batchSize:批量发送前的消息数。Spring中文文档

  • bufferLimit:批处理消息的最大大小。 如果超过,这将抢占 ,并导致发送部分批处理。batchSizeSpring中文文档

  • timeout:在没有新活动向批处理添加消息时发送部分批处理的时间。Spring中文文档

通过在每条嵌入的消息前面加上四字节二进制长度来格式化批处理。 通过将 message 属性设置为 ,可以将其传达给接收系统。SimpleBatchingStrategyspringBatchFormatlengthHeader4Spring中文文档

默认情况下,侦听器容器会自动取消批处理消息(通过使用消息标头)。 拒绝来自批处理的任何邮件将导致整个批处理被拒绝。springBatchFormat

但是,有关详细信息,请参阅批处理@RabbitListenerSpring中文文档

批处理数据保存在内存中。 如果发生系统故障,未发送的消息可能会丢失。
默认情况下,侦听器容器会自动取消批处理消息(通过使用消息标头)。 拒绝来自批处理的任何邮件将导致整个批处理被拒绝。springBatchFormat