Green Beans:企业消息传递和 Spring 入门

工程 | Josh Long | 2011 年 1 月 26 日 | ...

在本文中,我们将介绍消息传递的核心概念,以及 Spring 框架及其姐妹项目提供的丰富消息传递支持。

什么是消息传递?为了最好地解释这一点,我将转述 Gregor Hohpe 和 Bobby Woolf 的开创性著作《企业集成模式》(Addison Wesley, 2004)中提供的示例。当你打电话时,你会尝试将信息传达给另一方。只有当对方在你打电话时能够接听,这才会起作用。由于并不总能接到电话,因此我们使用语音邮箱来排队消息。呼叫者将消息留在语音邮箱中,然后被呼叫者可以稍后异步地检索消息(或实际上,许多消息)。

在这个例子中,语音邮箱位于双方之间。它存储消息,然后在被呼叫者(接收者)检索时将其传递。在企业消息传递领域,情况非常相似:一方将消息发送到消息代理(也称为消息导向中间件 - MOM),而另一方——当该方能够——在稍后接收或显式查询消息代理中的任何消息。

这正是类比停止有用的地方。与语音邮箱相比,消息代理具有许多选项。消息代理非常适合提供附加服务,例如路由,并保证消息传递。消息代理可以针对不同的用例进行优化,例如,你可以权衡速度与持久性。消息代理可能会将消息持久化到外部存储以确保持久性,尽管这通常是可以通过配置来切换以提高速度的选项。

在语音邮箱示例中,消息由一方发送,然后传递给另一方——通信是*点对点*的。消息代理支持这一点,以及另一种称为*发布/订阅*的通信类型,其中消息会传递给多个客户端。

消息代理的一个常见用途是解决两个不同系统之间的集成问题。发送到消息代理的数据通常是发送方和接收方都通用的格式。两个系统在使用消息代理时需要就数据合同达成一致。消息通常包含消息正文,其中存储了消息本身的内容,以及消息头,它们是键/值对,提供了有关消息正文的元数据,可用于帮助消息的消费者处理消息。消息头可以是任何你想要的内容,但它们通常与消息本身或消息的处理器相关。

Java Message Service

Java 消息服务 (JMS) API 规定了与消息代理交互的客户端接口。每个消息代理都提供自己的 API 实现,非常类似于 JDBC 驱动程序对 JDBC API 的作用。这意味着 JMS 客户端通常应该使用与服务器相同版本的客户端。有许多优秀的 JMS 代理实现可供选择。其中一个原因是消息传递一直是应用程序开发的重要组成部分,并且今天仍然如此。自 1.1 版本以来,JMS 一直是 J2EE(现为 Java EE)规范的一部分。在过去十年的大部分时间里,JMS 规范都停留在 1.1 版本。

在 JMS 中,客户端使用 javax.jms.ConnectionFactory 创建 javax.jms.Connection。然后可以使用 Connection 创建 javax.jms.SessionSession 代表客户端与代理的交互,并允许发送和接收消息以及其他不太明显的。操作。

该接口上最有用的方法与创建 javax.jms.Destination 的消息生产者和消息消费者有关。Destination 映射了消息代理上“地址”的 JMS 概念。它还映射了代理存储消息的位置。在 JMS 中,消息从同一位置发送、存储和消费,所有这些都由 javax.jms.Destination 实例表示。

[caption id="attachment_7506" align="alignnone" width="573" caption="上方,蓝色元素代表生产者和消费者。橙色元素代表代理中缓冲消息的目标。在 JMS 中,这些是主题或队列。"][/caption]

Destination 是一个接口,有两个更具体的子接口 javax.jms.Queuejavax.jms.TopicQueue 代表标准的队列,这是之前描述的点对点构造。Topic 提供发布/订阅消息传递,并将一条消息传递给多个接收者。

要将消息发送到 Destination,您必须创建一个 javax.jms.MessageProducer。然后可以使用 MessageProducer 发送 javax.jms.Message

JMS 支持两种不同的接收消息的机制。第一种方式是使用 javax.jmx.MessageConsumer#receive() 方法来请求消息,该方法以*同步*方式返回 Destination 中的单个消息;默认情况下,该方法会阻塞直到收到消息。而不是使用 MessageConsumer,客户端可以通过调用 javax.jms.Session#setMessageListener(MessageListener) 来安装 javax.jms.MessageListenerMessageListener 是一个接口,只有一个方法 public void onMessage(javax.jms.Message),每当 Destination 上有可供消费的 javax.jms.Message 时,就会调用该方法。MessageListener 提供*异步*消息处理:当消息到达时,它们会被处理。

JMS API 中还有更多内容需要学习,但这些类和概念将在我们讨论 Spring 对 JMS 消息传递的支持时对您最有帮助。第一层支持是 org.springframework.jms.core.JmsTemplate,它提供了简化的方法,将我们刚刚讨论的内容减少到一行代码。JmsTemplate 需要一个 javax.jms.ConnectionFactory 实例来完成其工作。JmsTemplate 可以为您完成大量工作。例如,要发送消息,JmsTemplate 会建立一个 javax.jms.Session,设置一个 javax.jms.MessageConsumerjavax.jms.MessageProducer,设置所有事务的机制,并为您提供对当前 javax.jms.Session 的引用,以便您可以创建您选择的消息并发送它。考虑到所有错误处理和构建逻辑,这很容易节省数十行代码。一旦您的消息已发送,它就会销毁或关闭其中大部分对象。这是应用程序服务器(如 Java EE 服务器)中的标准做法,因为 ConnectionFactory 实例由服务器创建、由服务器管理并进行池化。它们在使用后缓存实例。在这些环境中,关闭资源只是将它们返回到池中。因此,JmsTemplate 在标准情况下会做正确的事情,假设 ConnectionFactory 缓存或池化实例。

在应用程序服务器等托管环境中,您通常需要从 JNDI 获取 javax.jms.ConnectionFactory。您可以使用 Spring 来为您查找该引用并配置 JmsTemplate。在我们的示例中,我们希望更宽松地操作,因此我们将使用独立的 ActiveMQ 消息代理。ActiveMQ 是一个流行的、开源消息代理。要使用它,请下载它,然后在 bin 文件夹中运行适合您操作系统的启动脚本。在您的应用程序中,您需要客户端库来连接到相应版本的 ActiveMQ。在撰写本文时,ActiveMQ 的最新版本是 5.4.2。如果您使用 Maven,请将以下依赖项添加到您的 Maven pom 文件中



            <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>activemq-core</artifactId>
                <version>${activemq.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>activemq-optional</artifactId>
                <version>${activemq.version}</version>
            </dependency>

请确保为 ${activemq.version} 创建一个 Maven 属性,或者手动将字符串替换为相应的版本。还有一个 activemq-all 依赖项,但它会拉下许多可能不必要的 jar。对于我们的应用程序,上述两个依赖项就足够了。

将 Spring 与 JMS 结合使用

让我们检查一个基本 JMS 应用程序的配置。首先,让我们检查基本的 Spring XML 配置



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/200…

本周 Spring:2011 年 1 月 18 日

工程 | Josh Long | 2011 年 1 月 18 日 | ...

对于整个 Spring 社区来说,这又是激动人心的一周。除了激动人心的 Tomcat 7 稳定版发布公告外,社区还发布了许多精彩的文章。

  1. 我们继续“Green Beans”系列的回归基础,刚刚发布了一篇关于将 Spring 和 Maven 一起使用的文章。
  2. Tomcat Expert 社区宣布了Tomcat 7 的第一个稳定版本。我们知道 Tomcat 是 Spring 开发人员运行应用程序的首选场所,因此请务必查看最新功能。
  3. Nicholas Sankel 撰写了一篇关于使用Spring Roo 和 Vaadin UI 框架的博客。
  4. Tomcat Expert 社区提供了2010 年十大文章列表
  5. Tomasz Nurkiewicz 撰写了一篇精彩的博客,探讨了如何完全去除 XML 并使用 Spring 框架。
  6. Sivaprasadreddy Katamreddy撰写了 Spring AOP 的介绍,从存在问题的代码一直到使用 Spring AOP 的改进代码。
  7. 一位名叫(据我所知)Warlock 的绅士在他的博客中讨论了 Spring MVC 基于注解的会话处理支持
  8. Sal Peace 撰写了一篇精彩的介绍,关于使用Spring MVC 3.0 的 Portlet 支持与 WebSphere 7
  9. Viral Patel 撰写了一篇关于在 Spring 3 MVC 和 Hibernate 中保存和检索 BLOB 对象数据的教程。
  10. Jorram Barrez(来自Activiti 项目)发布了一篇关于如何使用 Spring 连接Activiti BPMN 2.0 业务流程到 EJB 业务服务的文章。

Green Beans:Maven 和 Spring 入门

工程 | Josh Long | 2011 年 1 月 17 日 | ...

Apache Maven 是一个流行的开源工具,它提供了一种约定优于配置的方法来管理项目构建。事实上,Eclipse Community Surveys 显示 Maven 的采用率从2009 年的 8% 增长到2010 年的 28%,这凸显了它在各种项目设置中的有用性。即使您可以在不使用 Maven 的情况下使用 Spring,但仍有许多理由建议 Spring 开发人员使用它。在本文中,我将向您展示如何开始使用 Maven,以及如何成功地将其与 Spring 库、仓库和工具(如SpringSource Tool SuiteSpring Roo)结合使用。

Maven 处理项目构建。如果您的项目遵循 Maven 的约定,Maven 可以相对轻松地提供强大的功能和复杂性。它是声明式的;您描述*要*做什么,而不是*如何*做。如果您来自 Make 或 Ant 等传统的构建工具,这种方法会显得不同。

您在 Maven 项目配置中声明项目的依赖项。然后,这些依赖项会被为您解析并下载。这类似于许多不同操作系统中的包系统。假设您使用的是 OS X 的 finkports 命令行工具。要更新操作系统的功能,用户会在管理客户端中选择一个包(例如,最新的安全补丁,或新版本的 glib 库)来安装,然后指示客户端从称为包仓库的已知服务器下载并安装它。下载包后,包管理器会查看包的清单,其中列出了该包所依赖的所有库(位于其他包中)——其传递依赖项。这些也会被下载。

如果您还没有安装 Maven,有几种安装方法。从Apache 网站下载。选择一个较新的版本。目前,许多人正在使用 Maven 2.21,或最近发布的 Maven 3。下载您想要使用的版本,然后将其解压到您选择的目录。或者,一些操作系统在包系统中提供 Maven 2 版本(很快也会有 Maven 3 版本)。例如,在 Ubuntu 上,您可以运行 sudo apt-get install maven2。如果您使用的是 SpringSource Tool Suite(此处免费下载),那么您无需担心,Maven 已经下载并包含在您的 STS 安装文件夹中。无论您如何将 Maven 二进制文件安装到您的系统中,请确保二进制文件在操作系统的搜索路径中。通常,这只是将 Maven 安装的 bin 文件夹添加到操作系统的 PATH 变量中。创建一个名为 MAVEN_HOME 的 Maven 安装本身系统的变量也是一个好习惯。在 Unix(包括 OS X)或 Linux 机器上,此设置看起来大致相同。在我的机器(一台 Ubuntu Linux 机器)上,它看起来像这样

export MAVEN_HOME=/home/jlong/bin/springsource/maven-2.2.1.RELEASE 
export PATH=$PATH:$MAVEN_HOME/bin

要进行测试,请打开一个新的 shell 并发出以下命令

mvn --version

您应该会看到一些输出,确认命令存在于您的系统中,如下所示

jlong@jlong-mbp:~/Desktop/code$ mvn --version 
Apache Maven 2.2.1 (r801777; 2009-08-06 12:16:01-0700) 
Java version: 1.6.0_22 
Java home: /usr/lib/jvm/java-6-sun-1.6.0.22/jre 
Default locale: en_US, platform encoding: UTF-8 
OS name: "linux" version: "2.6.35-22-generic" arch: "amd64" Family: "unix" 
jlong@jlong-mbp:~/Desktop/code$ 

Maven 入门

Maven 项目假定有一个标准的目录结构,该结构至少看起来像这样

./pom.xml ./src ./src/main ./src/main/java ./src/main/resources ./src/test ./src/test/java ./src/test/resources

目录结构的最顶层是一个 XML 文件(始终称为 pom.xml),Maven 期望在该位置找到它。pom.xml(POM 是 Project Object Model 的缩写)描述了项目特有的、无法自动推断的内容,例如依赖项、项目名称等。

目录 描述目录内容(相对于项目根目录)
src/main/java 包含项目的 Java 源代码
src/main/resources 包含项目任何类路径相关的资源(例如,Spring 应用程序上下文 .xml 文件)
src/test/java 包含测试的 Java 源代码…

Spring Roo 1.1.1 有哪些新特性

工程 | Ben Alex | 2011年1月11日 | ...

我们很高兴地宣布 Spring Roo 1.1.1 已正式发布。这个新版本包含 超过 250 项修复和增强,其中包括许多性能和功能改进。

一如既往,SpringSource Tool Suite (STS) 2.5.2 将很快发布并整合这个新版本的 Spring Roo。您也可以下载 Spring Roo 1.1.1 的独立版本并立即开始使用。

让我们简要介绍一下我们在 Roo 1.1.1 中添加的一些更值得注意的增强功能。如果您正在升级基于 Roo 的项目,我们鼓励您查阅我们包含在参考指南中的特定版本升级说明。参考指南也包含在……

Spring Web Services 2.0 发布

工程 | Arjen Poutsma | 2011年1月11日 | ...

经过近一年的开发,我很高兴地宣布 Spring Web Services 2.0 已经发布!在这篇文章中,我将介绍一些主要的新特性。

需要 Java 5+ 和 Spring 3.0

正如您可能已经知道的,我们将对象 XML 映射 (OXM) 模块从 Spring-WS 项目移到了 Spring 3.0 中。因此,由于 org.springframework.oxm 包中存在冲突的类,使用 Spring-WS 1.5(带有自己的 OXM 模块)与 Spring 3.0 可能会有些问题。

从 2.0 版本开始,我们不再将 OXM 模块作为 Spring-WS 的一部分发布,而是依赖 Spring 的 OXM。因此,Spring Web Services 2.0 需要 Spring 3.0 才能工作。通常,我们倾向于在版本要求方面更宽松一些,不一定要求最新的 Spring 版本,但这……

Green Beans:Spring 在您的服务层入门

工程 | Josh Long | 2011 年 1 月 8 日 | ...

所有应用程序都源于领域模型。“领域模型”一词描述了系统中对您要解决的问题很重要的事物,即名词或数据。服务层——业务逻辑所在之处——会操纵应用程序数据,并且最终必须持久化它(通常是在数据库中)。解释很简单,但在实践中,为任何开发人员构建一个好的服务层都可能是一项艰巨的任务。本文将向开发人员介绍 Spring 框架中用于构建更好的服务层的选项。假设读者已具备一些经验…

青豆:Spring MVC 入门

工程 | Colin Sampaleanu | 2011年1月4日 | ...

Spring MVC 作为 Spring 核心框架的一部分,是一个成熟且功能强大的响应式 Web 框架,具有广泛的功能和选项,旨在处理各种面向 UI 和非面向 UI 的 Web 层用例。所有这些对 Spring MVC 的新手来说都可能让人不知所措。我认为向这类读者展示如何通过很少的工作就能让一个简单的 Spring MVC 应用程序运行起来是很有用的(即将我的示例视为某种程度上“世界上最简单的 Spring MVC 应用程序”),而这正是我将在本文的其余部分中演示的内容。

我假设您熟悉 Java、Spring(基本的依赖注入概念)和基本的 Servlet 编程模型,但对 Spring MVC 不熟悉。阅读此博客文章后,读者可以通过查阅 Keith Donald 的 Spring MVC 3 案例展示 继续学习 Spring MVC……

Git 和社交编码:如何无畏地合并

工程 | Dave Syer | 2010年12月21日 | ...

Git 非常适合社交编码和开源项目的社区贡献:贡献者可以轻松地试用代码,并且可以有大量的人进行分叉和实验,而不会危及现有用户。本文提供了一些 Git 命令行示例,可能有助于您对这个过程建立信心:如何获取、拉取和合并,以及如何撤销错误。如果您对社交编码过程本身以及如何为 Spring 项目做出贡献感兴趣,请查看此网站上 Keith Donald 的另一篇博客

Grails 已经在 Github 上存在一段时间了,并且在社区贡献方面拥有丰富的经验,因此 SpringSource 的其他一些项目也开始迁移到那里。一些迁移的项目是新的(例如 Spring AMQP),一些已经建立并从 SVN 迁移(例如 Spring Batch)。在 SpringSource 托管的 Gitorious 实例上也有一些 Spring 项目,例如Spring Integration

Spring 项目中的社交编码

工程 | Keith Donald | 2010年12月21日 | ...

在过去的一年里,新的 Spring 项目在多个领域启动,包括社交移动数据集成。我从事这项工作近7年,说实话,对我来说,从未像今天这样令人兴奋。我之所以有这种感觉,是因为我们的社区理解通过在你之前奠定的基础上进行构建来提高标准的重要性。这就是我们能够如此迅速地发展的原因,这证明了由Juergen Hoeller领导的核心开发团队的质量。

让我非常兴奋的一件事是社区贡献的数量不断增加。这些传统上以补丁的形式通过 JIRA 提交,但现代社交编码平台如 GithubGitorious 开启了新的机遇。在这篇博文中,我想介绍一个新的贡献……

Spring Android and Maven (Part 1)

工程 | Roy Clarkson | 2010 年 12 月 17 日 | ...

我们最近宣布了Spring Android 的 M1 版本,并且随着该版本的发布,出现了一些关于如何构建利用 Spring Android Rest Template 和 Spring Android Commons Logging 库的 Android 应用程序的问题。Google 提供了多种编译 Android 应用程序的方法,包括 SDK 命令行工具和 Eclipse 的 ADT(Android Development Tools)插件。不幸的是,这两种方法都不包含集成的依赖项管理支持。

概述

作为 Java 开发人员,我们已经习惯了欣赏 Maven 和 Gradle 等工具来管理外部依赖项。虽然传统的 Java 应用程序运行在 JVM 上,但 Android 应用程序运行在 Dalvik 虚拟机上。Dalvik VM 执行 Dalvik Executable (.dex) 格式的文件。它运行由 Java 语言编译器编译后转换为 .dex 格式的类。如果构建工具想要能够编译具有依赖项的兼容 Android 应用程序,则需要支持此过程。

基本上有两种将外部库包含到 Android 应用程序中的选项。第一种是手动将 jar 文件复制到项目中的 libs 目录,并在 Eclipse 中更新类路径。这是最简单的解决方案,也是 ADT 插件最支持的解决方案。缺点是您必须手动管理依赖项。或者,可以使用第三方插件,例如Maven Android Plugin,以自动从 Maven 存储库中包含依赖项。

在本文中,我将引导您完成使用 Android 命令行工具、Maven、Maven Android Plugin 和Android Maven Artifacts 来编译使用 Spring Android 库的示例应用程序,并将其部署到 Android 模拟器。配置 Maven 后,可以轻松创建构建、将其部署到模拟器、运行测试以及打包应用程序以部署到 Android Market。在运行示例代码之前,我们将首先重点介绍 pom.xml 中所需的配置设置。本示例中使用的组件列出如下。

Maven 配置

本节介绍了在使用 Spring Android 和 Maven Android Plugin 进行开发时 pom.xml 所需的部分。

Maven Android Plugin

为了使用 Maven 构建 Android 应用程序,您需要在 pom.xml 文件中配置 Maven Android Plugin。Android 应用程序以 apk 文件而不是 jar 文件形式部署到设备。您必须在打包配置中指定这一点。


<packaging>apk</packaging>

要在构建任务中配置 Maven Android 和 Maven Compiler 插件,请将 sdk platform 设置为所需的级别。在此示例中,它设置为 9,对应于 Android 2.3.1 版本。emulator avd 值是您在 AVD Manager 中定义的 AVD(Android Virtual Device)的名称。在这种情况下,AVD 的名称为“9”,但 AVD 的名称可以随意命名,只要与您在创建 AVD 时指定的名称匹配即可。这是构建和运行 Android 应用程序所需的插件的基本配置…

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有

版权所有 © 2005 -2025Broadcom。保留所有权利。“Broadcom”一词指 Broadcom Inc. 和/或其子公司。
使用条款 隐私 商标指南

Apache®、Apache Tomcat®、Apache Kafka®、Apache Cassandra™ 和 Apache Geode™ 是 Apache Software Foundation 在美国和/或其他国家的商标或注册商标。Java™、Java™ SE、Java™ EE 和 OpenJDK™ 是 Oracle 和/或其关联公司的商标。Kubernetes® 是 Linux Foundation 在美国和其他国家的注册商标。Linux® 是 Linus Torvalds 在美国和其他国家的注册商标。Windows® 和 Microsoft® Azure 是 Microsoft Corporation 的注册商标。“AWS”和“Amazon Web Services”是 Amazon.com Inc. 或其关联公司的商标或注册商标。所有其他商标和版权均为其各自所有者的财产,仅为提供信息之目的提及。其他名称可能是其各自所有者的商标。