2007-07-19 | ![]() ![]() |
在使用ActiveMQ的時(shí)候把ActiveMQ的控制臺(tái)整合到web程序中是比較好的做法,這里有篇文章講解了這樣一個(gè)步驟http://www.oreillynet.com/onjava/blog/2007/06/integrating_activemq_web_conso.html。 原文作者:Dejan Bosanac 譯者:張榮華 由于水平所限,翻譯難免有不妥之處歡迎大家指正。 正文: 如果你的應(yīng)用程序整合了ActiveMQ,那么再把他的web控制臺(tái)也整合到你的應(yīng)用中應(yīng)該來說是很有意義的。它(ActiveMQ的web控制臺(tái))能為你的用戶提供基本的監(jiān)控和管理的操作功能。你可以采取的一個(gè)方案是把它做成一個(gè)war文件,整合進(jìn)系統(tǒng),但是如果你已經(jīng)在系統(tǒng)中整合了一大堆的ActiveMQ,你可能就只想引進(jìn)那些必需的庫(kù)和文件了。 事實(shí)上,我們并不能做到無縫整合(作者的無縫整合估計(jì)是指不需什么配置拿來即用的那種方式)。但是在做這項(xiàng)工作的時(shí)候我仍然發(fā)現(xiàn)了幾個(gè)步驟(希望可以幫助有同樣需求的人)。我使用maven2來作為構(gòu)建工具,它會(huì)組裝那些插件來創(chuàng)建一個(gè)最終的distribution。如果你使用一些不同的構(gòu)建環(huán)境,那么最好還是堅(jiān)持定制war文件。 首先,你需要使用version2.2或更新的maven assembly plugin。 然后把以下代碼片斷復(fù)制到你的pox.xml中去: xml 代碼
Version2.2的plugin需要一些額外的war解壓縮(這里的解壓縮就是指把war包中的內(nèi)容抽取出來)處理,待會(huì)我們就會(huì)看到了。 現(xiàn)在讓我們看看要在部署里面加些什么東西。首先我們需要?jiǎng)?chuàng)建一個(gè)依賴集(這里的依賴集其實(shí)不應(yīng)該翻譯,因?yàn)樽髡咧傅氖窍旅孢@個(gè) xml 代碼
這個(gè)配置片斷中有些部分值得注釋一下。正如你看到的那樣,我們已經(jīng)配置了程序來解壓縮war文件到/webapps/admin目錄。我們需要version2.2的assembly plugin的目的就是使用 xml 代碼
我的應(yīng)用程序是用jetty啟動(dòng)的, 這意味著所有需要的jar包已經(jīng)在應(yīng)用的classpath下了,所以這里,我們只需要包含這個(gè)特殊的web應(yīng)用所需要的jar包就可以了。同時(shí)在做這項(xiàng)工作的同時(shí)我也發(fā)現(xiàn)了一些有趣的事: 1當(dāng)上面所說的一些jar包不是直接放在ActiveMQ的web控制臺(tái)項(xiàng)目的classpath下(但是卻放在父應(yīng)用的classpath下),Web控制臺(tái)會(huì)拋出異常(不能發(fā)現(xiàn)資源,如TLD)。我還不確定原因,但是我猜這是一個(gè)類加載方面的問題。 在這種情況下,我需要明確的把它放到web應(yīng)用的classpath下,我并沒有去深入的研究這個(gè)問題。 2如果web控制臺(tái)是用它本身的classpath中的ActiveMQ,它會(huì)拋一個(gè)異常來定位嵌入的broker。這里有三種解決方案,一個(gè)把所有的ActiveMQ的jar包從WEB-INF/lib下移除(我們用這種),設(shè)置父應(yīng)用的classloader的優(yōu)先級(jí)(后面將會(huì)討論這個(gè)方法),或者使用其他的機(jī)制來配置web控制臺(tái)。 在我們?cè)O(shè)置好classpath之后,就是時(shí)候來正確的配置我的web控制臺(tái)了。默認(rèn)情況下,web控制臺(tái)會(huì)去加載webconsol-embedded.xml,并且會(huì)開啟一個(gè)broker并使用這個(gè)broker。因?yàn)槲覀円呀?jīng)有了我們自己的broker,那么這個(gè)新開啟的多余我們來說就是多余的了。所以我們需要提供我們自己的“輕量級(jí)”的配置: xml 代碼
最后唯一剩下需要做的就是配置我們的web應(yīng)用程序了。如果你沒有配置jetty,那么首先你需要配置一下它。剩下的你需要做的就是提供額外的web應(yīng)用程序的配置了,如下: xml 代碼
如果你使用spring,也可以這樣配置: xml 代碼
parentLoaderPriority屬性的作用是告訴jetty是加載父應(yīng)用的類還是本應(yīng)用的類(如果兩個(gè)應(yīng)用有重復(fù)的類的話)。從我觀察到的情況來看,在父應(yīng)用的類優(yōu)先級(jí)高的情況下,如果web控制臺(tái)需要老版本的jar包,那將會(huì)提高問題的發(fā)生概率,所以我把這個(gè)屬性設(shè)為false。 以后,我想把這些jar包從WEB-INF/lib移到一個(gè)公用的目錄,所有的web應(yīng)用都可以共享它。 最后,如果你能從庫(kù)(repository,指版本控制器的repository)中下載壓縮版本(沒有所需的jar文件,但是有現(xiàn)成的配置文件)的話那就太好了,解壓之后嵌入到父應(yīng)用中,那這個(gè)過程就變得輕而易舉了。 譯文結(jié)束 按照apache的說法,ActiveMQ的下一個(gè)版本5.0將默認(rèn)自帶web控制臺(tái),那么上面這些麻煩的步驟就可以省去了,但如果用5.0之前的版本的話,這篇文章可以作為一個(gè)參考。由于本人的語(yǔ)文水平問題,文章中不免有很多語(yǔ)句有不通順,希望大家能多多拍磚。 |
聯(lián)系客服