使用ActiveMQ支持Spring Integration路由

正如我在上 一篇 文章中所討論的那樣 ,Spring Integration(SI) 是在Spring Framework之上構建的路由框架 ,它使您可以使用經過驗證的企業集成模式來通過消息傳遞解決系統集成問題。 配置好SI并執行路由和中介邏輯后,您可能會發現您想采取下一步措施,并為解決方案增加更多的穩定性 。

您可能希望將某些路由,中介或服務邏輯分布在多個主機上,可能希望為通過SI通道傳輸的消息增加一些可靠性,并且可能希望比采用傳統的客戶端-服務器體系結構。 好吧,實現上述某些目標的一種方法是使用消息代理來支持您的SI路由。 SI為AMQP代理和JMS代理提供抽象。 在本文中,我想使用Spring Integration Samples項目中的Cafe示例來說明如何使用流行的ActiveMQ消息代理通過JMS支持您的SI路由。

JMS是將現有Java解決方案與消息傳遞集成的好方法。 由于JMS規范是一個API,因此無論您使用的是哪個代理,都可以充分利用依賴于代理的接口。 您可以使用ActiveMQ,WebSphere MQ或任何其他符合JMS的消息代理。 在本示例中,我選擇ActiveMQ是因為它的成熟度,健壯性,在行業中的普遍性以及它是具有Apache許可的Apache Software Foundation的開源軟件。 它完全實現了JMS 1.1,提供了高可用性,并且可以通過代理網絡進行水平擴展。 如果要集成Java應用程序,請堅持使用JMS。 ActiveMQ還為C ++,C#,Ruby,Python,Erlang和其他許多應用程序提供綁定( 完整列表請參見其網站 )
注意,AMQP也是可行的選擇。 AMQP指定了一種線級協議,該協議允許在不同平臺和/或異構語言上構建的消息傳遞系統彼此進行互操作(不只是可以使用JMS API的java / JVM)。 Cafe演示已經實現了與Spring的RabbitMQ服務器(Spring產品組合中的流行開源AMQP代理)一起使用的AMQP實現。
有關AMQP和JMS之間區別的更多信息,包括它們如何工作,各自使用的不同術語以及兩者的簡要歷史記錄, 請參閱Mark Richards ( Java消息服務書的作者之一) 撰寫的這篇出色的PDF文章。 (來自O'Reilly)
可以在我在github.com 上的Spring Integration Samples項目的分支版本中找到與該帖子相關的代碼。 查看/ applications / cafe maven模塊以獲取我的代碼。 ?
使用點對點或發布-訂閱JMS目標支持頻道
在我的示例中,我選擇使用嵌入式代理 。 由于ActiveMQ是純Java解決方案,因此您可以將代理嵌入Java應用程序中并在內部使用它,并允許外部客戶端連接并參與消息傳遞。 這樣做不會以任何方式限制您配置ActiveMQ的能力。 使用自己的嵌入式代理部署完整的集成解決方案要比依靠(由另一個組?)或在外部配置外部實例更容易。
基于ActiveMQ的解決方案的所有spring配置文件可以在/ src / main / resources下的META-INF / spring / integration / activemq類路徑中找到。
與支持具有JMS目標的SI通道有關的文件是cafeDemo-amq-config.xml和cafeDemo-amq-jms-backed.xml 。 cafeDemo-amq-config.xml文件負責配置與ActiveMQ代理的連接。 連接工廠的名稱非常重要,在本例中為“ connectionFactory”,因為SI缺省情況下將查找具有該名稱的bean,以配置稍后由JMS支持的通道使用的目的地。
cafeDemo-amq-jms-backed.xml文件看起來與cafe示例的非經紀人實現( cafeDemo-xml.xml )非常相似,不同之處在于通道已轉換為JMS支持的版本,并且ActiveMQ代理是嵌入其余配置。 請注意,用于嵌入代理的方法允許在spring文件中進行完整配置。對于此示例,不依賴于外部運行的代理。 這個小示例的配置僅設置了一個傳輸連接器(在默認端口61616上,我們可以使用vm:// transport ,但是我想顯示一個使用TCP的示例),并且未配置代理安全性,目標策略但是,它的確利用了現成的配置詳細信息,包括JMX管理MBean,以及通過推薦并高度優化的KahaDB進行的消息持久性。 有關更多信息,請參見ActiveMQ文檔。
在原始配置中,將用于“ coldDrinks”和“ hotDrinks”的通道設置為輪詢通道。 要使用JMS目標完成此操作,請將通道上的“消息驅動”屬性設置為“ false”。 在這種情況下,我們不需要提前聲明目的地名稱,但是如果您想在目的地周圍添加額外的安全性和授權屬性,則不妨在代理上或通過代理提前創建它們。 SI配置。 運行此樣本的主要類是org.springframework.integration.samples.cafe.xml.CafeDemoActiveMQBackedChannels 。
觀察是否確實在使用ActiveMQ的最佳方法是運行該示例,并使用JConsole復審JMX服務器中的MBean。 在JConsole中,您確實可以看到消息正在通過隊列入隊和出隊,和/或從主題中使用。 要測試使用ActiveMQ獲得的魯棒性,請嘗試運行示例并中途中止它。 然后注釋掉主文件中添加訂單到系統的行,然后重新啟動示例。 當異常終止時,它將繼續處理從其中斷處開始的處理。 只需更改通道的幾行配置,即可獲得可靠性和恢復能力。 ?
如何在不同的服務器上或至少在同一JVM外部運行路由的不同部分呢?
這使您可以添加路由的特定部分的更多實例,以提高吞吐量和可伸縮性,而無需進行任何代碼更改(其他優點)。 只需將更多消費者吸引到隊列/主題即可。 兩種概念都可以在SI流程內(僅使用SI通道)使用,也可以在其流程外(使用JMS)使用。
為了證明這一點,我們將使用SI提供的JMS入站/出站網關和/或通道適配器。 使用JMS網關,我們可以實現請求-答復消息交換,而通道適配器則允許我們使用異步語義來激發和忘記。
該示例的設置方法與AMQP示例的設置方法相同,它也依賴于外部運行的代理(盡管我們可以如上所述嵌入它)。 首先,運行運行消費者(CafeDemoAppBaristaColdActiveMQ,CafeDemoAppBaristaHotActiveMQ),以監聽冷飲或熱飲訂單。 接下來,啟動負責主要流程和業務流程的流程(CafeDemoAppOperationsActiveMQ)。 編排流程處理接單,將訂單分流,將其路由到適當的服務(上面的冷熱咖啡Baristas),然后處理響應并匯總以供服務員交付。 在這里,您將看到正確設置的JMS網關。 最后,您需要運行將訂單發送到訂單隊列(CafeDemoAppActiveMQ)實際啟動訂單的過程。
所有這四個過程都彼此獨立運行,并且在必要時可以在單獨的計算機上運行。 它們具有自己的應用程序上下文,并且僅對ActiveMQ消息代理可見。 這是一個高度模塊化且解耦的解決方案,使用消息代理進行可靠的通信。 如上所述,可以將代理配置為具有高可用性,因此這不是故障點。
這種架構的優點:
  • 消息可靠性–消息代理存儲和轉發消息。 郵件最多只能發送一次。 如果代理崩潰,以前未發送的消息將保留,并且如果消費者沒有收到,則可以重新發送
  • 靈活性–通過分離組件并依靠EIP,您可以彼此獨立維護,包括部署,增強功能等
  • 限制或增加消息處理–組件在自己/獨立的進程或盒子或世界各地運行,您可以配置每個組件以消耗或限制消息,具體取決于環境可以處理的數量
  • 擴展–為了處理更高的吞吐量,只需添加更多組件實例以偵聽JMS目標
缺點:
  • 復雜性–將多個組件打包到一個流程中,維護多個組件更為復雜
  • 調試–復雜性增加,調試困難。 異步過程天生就很難調試
看一下我的github repo中的Spring Integration示例 。 完整記錄了用于配置ActiveMQ連接的應用程序上下文文件。
參考: Christian Posta軟件博客中的JCG合作伙伴 Christian Posta從ActiveMQ支持Spring集成路由 。

翻譯自: https://www.javacodegeeks.com/2012/05/backing-spring-integration-routes-with.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373107.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373107.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

quagga源碼分析--路由信息處理zebra-rib

對于各個協議生成的路由信息的處理屬于quagga中非常重要的一個功能,如何在內核進行路由增加,更新,刪除是一個復雜的過程。 quagga在thread任務調度中加入了一種工作隊列,work_queue,與內核的工作隊列類似,是…

android 關閉藍牙打電話功能,Android藍牙開發【八】hfp接聽、掛斷電話

繼續研究hfp相關功能。藍牙耳機可以控制手機接聽、拒接、掛斷電話,撥打電話等功能。本文主要分析下起這些操作的大致流程。在系統應用Bluetooth中com_android_bluetooth.cpp提供了多個回調方法,由hardware、協議棧回調過來。藍牙耳機的一些控制命令都會發…

android在listview中放入從sdcard讀取的bitmap

重寫viewbinder public class viewbinder_bookmark implements SimpleAdapter.ViewBinder{Overridepublic boolean setViewValue(View view, Object data, String textRepresentation){if(view instanceof ImageView && data instanceof Bitmap){ImageView imageview(I…

將狀態機模式實現為流處理器

在我的上一個博客中,我說我真的以為某些“四人行”(GOF)模式已經過時了,如果不是過時的話肯定不受歡迎。 特別是我說過StateMachine不是那么有用,因為您通常會想到另一種更簡單的方式來執行您正在執行的事情&#xff0…

android 自定義actionbar,如何讓android的actionbar浮動且透明

如上圖所示,谷歌地圖的actionbar是透明的,且浮動在整個布局之上,沒有占用布局空間。其實要做到這樣的效果,我們首先想到的是兩個方面:1.將讓actionbar浮動起來。2.給actionbar一個背景,可以為顏色也可以為圖…

CentOS 7安裝redis及php擴展

安裝remi源 # wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # rpm -Uvh remi-release-7.rpm # sed -i -e "s/enabled1/enabled0/g" /etc/yum.repos.d/remi.repo 確認使用remi源時安裝的Redis版本。 安裝Redis 使用remi源yum安裝Redis。 # yum …

對Openshift上的Play Framework 2應用進行故障排除

Openshift故障排除 使用“ 自己動手”應用程序類型,您實際上可以有很大的自由度來支持幾乎可以在Linux機器上構建和運行的任何框架或服務器。 但是您必須做功課,并做一些研究。 因此,在本文中,我將向您展示一些我在使用Openshift和…

關于更換頭像的整個過程理解

之前我遇到一個問題,就是怎樣修改頭像,都沒有更改,后來把某個參數置為null,就解決了問題,但是知其然還要知其所以然,現在還是著重去梳理整個流程 頭像,需要關注的是3個變量: 本地地址…

Ajax與CustomErrors的尷尬

在ASP.NET程序中&#xff0c;為了給用戶顯示友好的錯誤信息&#xff0c;通常在web.config中進行如下的設置&#xff1a; <customErrors mode"RemoteOnly" defaultRedirect"/error/error.htm"> </customErrors> 但如果是一個ajax請求在服務端發…

JSF開發人員應該知道的5種有用方法

這篇文章的目的是總結一些JSF開發人員可以在日常工作中使用的便捷方法。 實用程序類是將所有方法放在一起的好地方。 我會稱此類為FacesAccessor。 第一種方法可能是最常用的方法。 它以給定名稱返回托管bean。 必須按faces-config.xml或注釋注冊該bean。 注入是好的&#xff0…

android項目編碼規范,Android 項目規范

Android 項目規范本文檔的目的是定義項目規范。這些應遵循整個 Android 項目以幫助我們保持整潔和統一的代碼庫。 &#x1f642;

Java創建WebService服務及客戶端實現

簡介 WebService是一種服務的提供方式&#xff0c;通過WebService&#xff0c;不同應用間相互間調用變的很方便&#xff0c;網絡上有很多常用的WebService服務&#xff0c;如&#xff1a;http://developer.51cto.com/art/200908/147125.htm&#xff0c;不同的語言平臺對…

01-17權限管理

管理頁面&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equi…

Java靜態方法可能會產生代碼異味

代碼氣味的定義 &#xff08;來自維基百科&#xff09;&#xff1a; “程序源代碼中任何可能表明存在更深層問題的癥狀。” 在Java中&#xff0c; 靜態方法允許您在“類范圍”內執行代碼&#xff0c;而不是像成員方法這樣的實例范圍。 這意味著&#xff0c;它們依賴于類級別的變…

android json 解析圖片,JSON解析并獲取android中的圖像

我想解析包含字符串和圖像的JSON對象。我的代碼正在工作&#xff0c;但它加載圖像太慢。我想加載另一個asynctask或服務的圖像&#xff0c;以減少加載時間。我怎樣才能做到這一點&#xff1f;哪一個是最好的方法使用asynctask或服務&#xff1f;這里是我的代碼JSON解析并獲取an…

Node Express4.x 片段視圖 partials

1.在Express 4.x使用片段視圖&#xff0c;需要引入partials模塊 步驟&#xff1a; 1.在全局中安裝express-partials模塊&#xff1a; 2.在本地模塊中安裝express-partials,將模塊安裝到package.json中&#xff1a; 3.在入口文件(如&#xff1a;app.js)中引入模塊&#xff1a; v…

bzoj1690:[Usaco2007 Dec]奶牛的旅行(分數規劃+spfa判負環)

PS:此題數組名皆引用&#xff1a;戳我 題目大意&#xff1a;有n個點m條有向邊的圖&#xff0c;邊上有花費&#xff0c;點上有收益&#xff0c;點可以多次經過&#xff0c;但是收益不疊加&#xff0c;邊也可以多次經過&#xff0c;但是費用疊加。求一個環使得收益和/花費和最大&…

安全密碼存儲–請勿做的事和Java示例

安全存儲密碼的重要性 作為軟件開發人員&#xff0c;我們最重要的職責之一就是保護用戶的個人信息。 沒有我們應用程序的技術知識&#xff0c;用戶別無選擇&#xff0c;只能相信我們正在履行這一責任。 令人遺憾的是&#xff0c;在密碼方面&#xff0c;軟件開發社區的記錄不一。…

紅米note4x Android7,紅米Note4X能升級安卓7.0嗎?紅米Note4X如何升級Android7.0?

歡迎來到PPL網站的行業資訊知識分類&#xff0c;你現在觀看的這篇文章要和大家分享的是關于紅米Note4X能升級安卓7.0嗎&#xff1f;紅米Note4X如何升級Android7.0&#xff1f;的一些相關內容&#xff0c;希望大家能夠感興趣&#xff0c;并且希望我們能夠幫助到你&#xff01;在…

java基礎----數字簽名算法的介紹

數字簽名&#xff08;又稱公鑰數字簽名&#xff09;是一種類似寫在紙上的普通的物理簽名&#xff0c;但是使用了公鑰加密領域的技術實現&#xff0c;用于鑒別數字信息的方法。關于數字簽名的介紹&#xff0c;可以參見百度百科&#xff1a;http://baike.baidu.com/view/7626.htm…