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. 或其關聯公司的商標或註冊商標。所有其他商標和版權均為其各自所有者的財產,僅為提供資訊之目的提及。其他名稱可能是其各自所有者的商標。