- 作者简介
- 内容提要
- 关于本书
- 路线图
- 代码规范与下载
- 作者在线
- 封面插图简介
- 前言
- 译者序
- 致谢
- 第1部分 Spring 的核心
- 第1章 Spring 之旅
- 第2章 装配 Bean
- 第3章 高级装配
- 第4章 面向切面的 Spring
- 第2部分 Web 中的 Spring
- 第5章 构建 Spring Web 应用程序
- 第6章 渲染 Web 视图
- 第7章 Spring MVC 的高级技术
- 第8章 使用 Spring Web Flow
- 第9章 保护 Web 应用
- 第3部分 后端中的 Spring
- 第10章 通过 Spring 和 JDBC 征服数据库
- 第11章 使用对象-关系映射持久化数据
- 第12章 使用 NoSQL 数据库
- 第13章 缓存数据
- 第14章 保护方法应用
- 第4部分 Spring 集成
- 第15章 使用远程服务
- 第16章 使用 Spring MVC 创建 REST API
- 第17章 Spring消息
- 第18章 使用 WebSocket 和 STOMP 实现消息功能
- 第19章 使用 Spring 发送 Email
- 第20章 使用 JMX 管理 Spring Bean
- 第21章 借助 Spring Boot 简化 Spring 开发
17.3.3 使用 RabbitTemplate 发送消息
顾名思义,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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论