spring amqp send message(5)

发送消息时,您可以使用以下任何一种方法:

    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交换名(以及路由键)。最后一个参数是负责实际创建消息实例的回调函数。下面的例子展示了如何使用send方法发送消息:

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

如果您计划在大部分时间或全部时间使用模板实例发送到同一个exchange,则可以在模板本身上设置exchange属性。在这种情况下,可以使用前面清单中的第二种方法。下面的例子在功能上与前面的例子相同:

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

如果模板上同时设置了exchange和routingKey属性,则可以使用只接受消息的方法。下面的例子说明了如何做到这一点:

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

考虑exchange和路由键属性的更好方法是显式方法参数总是覆盖模板的默认值。事实上,即使您没有显式地在模板上设置这些属性,也总是存在默认值。在这两种情况下,默认值都是空字符串,但这实际上是一个合理的默认值。就路由键而言,它并不总是必需的(例如,对于Fanout exchange)。此外,队列可以绑定到具有空字符串的交换。这些都是依赖于模板的路由键属性的默认空字符串值的合法场景。就exchange名称而言,通常使用空字符串,因为AMQP规范将“缺省exchange”定义为没有名称。由于所有队列都自动绑定到缺省交换器(这是一个direct交换器),使用它们的名称作为绑定值,因此可以使用上面清单中的第二种方法通过缺省交换器向任何队列发送简单的点对点消息。您可以通过在运行时提供方法参数,将队列名称作为routingKey提供。下面的例子说明了如何做到这一点:

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

 

另一种方法是,您可以创建一个模板,该模板主要用于发布或仅用于发布到单个队列。下面的例子说明了如何做到这一点:

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));

Message Builder API

从1.3版本开始,MessageBuilder和MessagePropertiesBuilder提供了一个消息构建器API。这些方法提供了一种方便的“流畅”方法来创建消息或消息属性。下面的例子展示了fluent API的实际应用:

    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()。

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

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对象

 

提供了三个静态方法来创建MessagePropertiesBuilder实例:

public static MessagePropertiesBuilder newInstance() 1

public static MessagePropertiesBuilder fromProperties(MessageProperties properties) 2

public static MessagePropertiesBuilder fromClonedProperties(MessageProperties properties) 3

1 使用默认值初始化一个新的message properties对象。

2 用提供的properties对象初始化构建器,build()将返回。

3 参数的属性被复制到一个新的MessageProperties对象中。

 

使用AmqpTemplate的RabbitTemplate实现,每个send()方法都有一个重载版本,该版本接受一个额外的CorrelationData对象。当publisher确认已启用时,此对象将在AmqpTemplate中描述的回调中返回。这允许发送方将确认(ack或nack)与发送的消息关联起来。

从1.6.7版本开始,引入了CorrelationAwareMessagePostProcessor接口,允许在消息转换之后修改相关数据。下面的例子展示了如何使用它:

Message postProcessMessage(Message message, Correlation correlation);

在2.0版本中,这个接口是不推荐的。该方法已被移动到MessagePostProcessor,并带有一个默认实现,该实现将委托给postProcessMessage(Message Message)。

同样从1.6.7版本开始,提供了一个名为CorrelationDataPostProcessor的回调接口。这将在所有MessagePostProcessor实例(在send()方法中提供)和setBeforePublishPostProcessors()中提供的实例之后调用。实现可以更新或替换send()方法中提供的相关数据(如果有的话)。消息和原始的相关数据(如果有的话)作为参数提供。下面的例子展示了如何使用postProcess方法:

 

CorrelationData postProcess(Message message, CorrelationData correlationData);

 

发布回退

当模板的mandatory属性为true时,返回的消息由AmqpTemplate中描述的回调提供。

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

发布者返回值也可以由RabbitTemplate在发送和接收操作中在内部使用。有关更多信息,请参见回复超时。

 

Batching

版本1.4.2引入了BatchingRabbitTemplate。这是RabbitTemplate的子类,带有一个覆盖的send方法,该方法根据BatchingStrategy对消息进行批处理。只有当批处理完成时,才将消息发送到RabbitMQ。下面的清单显示了BatchingStrategy接口定义:

public interface BatchingStrategy {
        MessageBatch addToBatch(String exchange, String routingKey, Message message);
        Date nextRelease();
        Collection<MessageBatch> releaseBatches();

}

成批数据保存在内存中。在系统发生故障时,未发送的消息可能会丢失。

 

提供了一种简单的批处理策略。它支持将消息发送到单个exchange 或路由键。它具有以下性质:

•批处理大小:  批处理发送前的消息数量。

 缓冲限制: 批处理消息的最大大小。如果,这将抢占批处理大小超过,并导致发送部分批处理。

•超时:当没有向批处理添加消息的新活动时,发送部分批处理的时间。

SimpleBatchingStrategy通过在每个嵌入的消息前面加上4字节的二进制长度来格式化批处理。通过将springBatchFormat message属性设置为lengthHeader4,可以将此消息传递给接收系统。

批处理消息由侦听器容器自动反批处理(通过使用springBatchFormat消息头)。拒绝批处理中的任何消息都会导致整个批处理被拒绝。成批数据保存在内存中。在系统发生故障时,未发送的消息可能会丢失。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值