> For the complete documentation index, see [llms.txt](https://potoyang.gitbook.io/spring-in-action-v4/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://potoyang.gitbook.io/spring-in-action-v4/untitled-10.md).

# 第 17 章　Spring 消息

本章内容：

* 异步消息简介
* 基于 JMS 的消息功能
* 使用 Spring 和 AMQP 发送消息
* 消息驱动的 POJO

在星期五下午 4 点 55 分，再有几分钟你就可以开始休假了。现在，你的时间只够开车到机场赶上航班了。但是在你打包离开之前，你需 确定老板和同事了解你目前的工作进展，这样他们就可以在星期一继续完成你留下的工作。不过，你的一些同事已经提前离开过周末去 了，而你的老板正在忙于开会。你该怎么办呢？

你可以给老板打电话，但是这样做就会因为一个不重要的状态报告而造成不必要的会议中断。或许你可以再坚持一会，等到会议结束。但是令人郁闷的是，你根本不知道会议还要持续多长时间，而你又要赶飞机。或者，你可以在他的显示器上留一个便条，不过要和其他的 100 个便条贴在一起。

要想既传达到你的工作状态又能赶上飞机，最有效的方式就是发送一封电子邮件给你的老板和同事，详述工作进展并且承诺给他们寄张明信片。你不知道他们在哪里，也不知道他们什么时候才能真正读到你的邮件。但是你知道，他们终究会回到他们的办公桌旁，阅读你的邮件。而此时，你正在赶往机场的路上。

有些时候，需要直接和某些人交谈。如果你受伤了，需要救护车，你可能会拿起电话 —— 而不会给医院发电子邮件。不过，在通常情况下，发送消息就可以满足要求，并且跟直接通信相比更具有一些优势，例如可以让你继续你的假期。

在前面的一些章中，你看到了如何使用 RMI、Hessian、Burlap、HTTP invoker 和 Web 服务在应用程序之间进行通信。所有这些通信机制都是同步的，客户端应用程序直接与远程服务相交互，并且一直等到远程过程完成后才继续执行。

同步通信有它自己的适用场景。不过，对于开发者而言，这种通信方式并不是应用程序之间进行交互的唯一方式。异步消息是一个应用程序向另一个应用程序间接发送消息的一种方式，这种方式无需等待对方的响应。相对于同步消息，异步消息具有多个优势，关于这一点你很快就会看到。

借助 Spring，我们有多个实现异步消息的可选方案。在本章中，我们将会看到如何在 Spring 中使用 Java 消息服务（Java Message Service， JMS）和高级消息队列协议（Advanced Message Queuing Protocol，AMQP）发送和接收消息。除了基本的消息发送和接收之外，我们还会看到 Spring 对消息驱动 POJO 的支持，它是一种与 EJB 的消息驱动 Bean（message-driven bean，MDB）类似的消息接收方式。
