返回介绍

17.3.3 使用 RabbitTemplate 发送消息

发布于 2024-08-17 00:45:49 字数 2687 浏览 0 评论 0 收藏 0

顾名思义,RabbitMQ连接工厂的作用是创建到RabbitMQ的连接。如果你希望通过RabbitMQ发送消息,那么你可以将connectionFactorybean注入到AlertServiceImpl类中,并使用它来创建Connection,使用这个Connection来创建Channel,然后使用这个Channel发布消息到Exchange上。

是的,你的确可以这样做。

但是,如果这样做的话,你要做许多的工作并且会涉及到很多样板式代码。Spring所讨厌的一件事情就是样板式代码。我们已经看到Spring提供模板来消除样板式代码的多个例子——包括本章前面所介绍的JmsTemplate,它消除了JMS的样板式代码。因此,Spring AMQP提供RabbitTemplate来消除RabbitMQ发送和接收消息相关的样板式代码就一点也不让人感觉奇怪了。

配置RabbitTemplate的最简单方式是使用rabbit命名空间的<template>元素,如下所示:

现在,要发送消息的话,我们只需要将模板bean注入到AlertServiceImpl中,并使用它来发送Spittle。如下的程序清单展现了一个新版本的AlertServiceImpl,它使用RabbitTemplate代替JmsTemplate来发送Spittle提醒。

程序清单17.7 使用RabbitTemplate来发送Spittle

可以看到,现在sendSpittleAlert()调用RabbitTemplate的convertAndSend()方法,其中RabbitTemplate是被注入进来的。它传入了三个参数:Exchange的名称、routing key以及要发送的对象。注意,这里并没有指定消息该路由到何处、要发送给哪个队列以及期望哪个消费者来获取消息。

RabbitTemplate有多个重载版本的convertAndSend()方法,这些方法可以简化它的使用。例如,使用某个重载版本的convertAndSend()方法,我们可以在调用convertAndSend()的时候,不设置Exchange的名称:

如果你愿意的话,还可以同时省略Exchange名称和routing key:

如果在参数列表中省略Exchange名称,或者同时省略Exchange名称和routing key的话,RabbitTemplate将会使用默认的Exchange名称和routing key。按照我们之前的配置,默认的Exchange名称为空(或者说是默认没有名称的那一个Exchange),默认的routing key也为空。但是,我们可以在<template>元素上借助exchange和routing-key属性配置不同的默认值:

不管设置的默认值是什么,我们都可以在调用convertAndSend()方法的时候,以参数的形式显式指定它们,从而覆盖掉默认值。

RabbitTemplate还有其他的方法来发送消息,你可能会对此感兴趣。例如,我们可以使用较低等级的send()方法来发送org.springframework.amqp.core.Message对象,如下所示:

与convertAndSend()方法类似,send()方法也有重载形式,它们不需要提供Exchange名称和/或routing key。

使用send()方法的技巧在于构造要发送的Message对象。在这个“Hello World”样例中,我们通过给定字符串的字节数组来构建Message实例。对于String值来说,这足够了,但是如果消息的负载是复杂对象的话,那它就会复杂得多。

鉴于这种情况,我们有了convertAndSend()方法,它会自动将对象转换为Message。它需要一个消息转换器的帮助来完成该任务,默认的消息转换器是SimpleMessageConverter,它适用于String、Serializable实例以及字节数组。Spring AMQP还提供了其他几个有用的消息转换器,其中包括使用JSON和XML数据的消息转换器。

现在,我们已经发送了消息,接下来我们转向回话的另外一端,看一下如何获取消息。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文