ActiveMQ從源碼構建

前幾天和AMQ對接的模塊的同事說想學AMQ,因為總覺得AMQ有一些可以優(yōu)化的點袍镀,她想看看源碼。讓我想起在使用AMQ時冻晤,受限甚多苇羡,可以的話,也最好研究一下源碼鼻弧,看看能不能修改一些代碼為項目所用设江。
說實話,作為一個十幾年的開源軟件攘轩,AMQ的源碼部分一直是我挺害怕去觸碰的叉存,每次看著幾百個java文件我就開始懵圈。但是開始接觸程序設計也幾年了度帮,開源軟件的源碼歼捏,特別是這種成熟的源碼,一定要嘗試去鉆研笨篷,才能讓自己的水平得到提高瞳秽。想想其實這也是分階段的,一開始學著用率翅,了解深入以后嘗試寫插件练俐,最后開始改源碼。

對于AMQ來說安聘,有幾個優(yōu)化點是我很早就想改的:

  1. AMQ建立連接時無法指定本地IP痰洒。但是其實SOCKET接口是可以指定本地IP的旧找。這個功能的限制導致了項目組做了一整套功能來定義客戶端的真實IP庄吼。
  2. 在系統(tǒng)時間改變時,F(xiàn)ailover機制生效话告,MQ重建連接以后念颈,consumer.recieve()方法里有個sleep()泉粉,在時間往過去跳轉的時候(比如從10點跳回當日0點),receive()的sleep()會等待極長的時間(10-0=10個小時),這樣整個客戶端就卡死了嗡靡。
  3. 設置MessageTTL(消息在集群中能經(jīng)過的服務器數(shù)量)為1時跺撼,經(jīng)常出現(xiàn)消息卡在服務器上的情況,只能設置MessageTTL=2讨彼,但是這樣使用TOPIC的時候歉井,就會發(fā)現(xiàn)消息會在集群內被傳播N次,網(wǎng)絡流量大增哈误。

————————分割線————————

開源軟件的二次開發(fā)哩至,應該有以下幾個步驟:
1、讀源碼修改源碼
2蜜自、編譯形成bin文件
3菩貌、安裝并測試

源碼好找,頭疼的是不知道該怎么編譯重荠,怎么從源碼構建出實際可執(zhí)行的程序箭阶。從網(wǎng)上找了下資料,整理并且實踐如下:

所需的環(huán)境:JDK1.7(JDK1.8)戈鲁,MAVEN 3.5

Maven的安裝

  1. 從Maven的官網(wǎng)下載apache-maven-3.5.0-bin.zip仇参,下載地址為
    http://maven.apache.org/download.cgi
  2. 由于使用mac,解壓后需要配置環(huán)境變量荞彼,mac的環(huán)境變量配置地址為~/.bash_profile冈敛,需要配置MAVEN_HOME和PATH
    MAVEN_HOME=/Users/code/apache-maven-3.5.0
    PATH=$MAVEN_HOME/bin:$PATH
  3. 配置完成后執(zhí)行一下
    $ source ~/.bash_profile
    讓變量生效,然后mvn -v 就可以看到是否成功安裝了
$ mvn -v
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T03:39:06+08:00)
Maven home: /Users/code/apache-maven-3.5.0
Java version: 1.7.0_79, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
......

ActiveMQ從源碼構建

安裝完Maven后鸣皂,從ActiveMQ的官網(wǎng)地址下載源碼,我下的是當前最新的5.15.0版本暮蹂。
activemq-parent-5.15.0-source-release.zip
解壓到本地后寞缝,使用terminal進入該目錄,而后執(zhí)行

$ cd /User/code/activemq-parent-5.13.0 
$ mvn -Dtest=false -DfailIfNoTests=false clean install

就會直接開始下載各種jar包到本地了仰泻。
tip:中途如果出現(xiàn)build error荆陆,多重復幾次上面的命令。
下載完到編譯的步驟的時候集侯,出現(xiàn)了一個報錯

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project activemq-openwire-generator: Fatal error compiling: 無效的目標發(fā)行版: 1.8 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :activemq-openwire-generator

看到1.8我就感覺是JDK出了問題被啼,檢查一下activemq的5.15.0的版本所需要的jdk版本

Java 8 Required
The minimum Java version has been upgraded to Java 8.

好吧。棠枉。浓体。我重新下了個5.14.0的版本,覺得不保險又去下了個jdk1.8 for Mac辈讶。命浴。開始重新編譯

漫長的等待后(最后顯示1個小時8分鐘。。生闲。媳溺。),出現(xiàn)了如下的提示

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] ActiveMQ ........................................... SUCCESS [  2.702 s]
[INFO] ActiveMQ :: Openwire Generator ..................... SUCCESS [  3.421 s]
[INFO] ActiveMQ :: Client ................................. SUCCESS [ 23.811 s]
[INFO] ActiveMQ :: Openwire Legacy Support ................ SUCCESS [  4.590 s]
[INFO] ActiveMQ :: JAAS ................................... SUCCESS [ 18.929 s]
[INFO] ActiveMQ :: Broker ................................. SUCCESS [01:18 min]
[INFO] ActiveMQ :: KahaDB Store ........................... SUCCESS [01:07 min]
[INFO] ActiveMQ :: STOMP Protocol ......................... SUCCESS [ 27.665 s]
[INFO] ActiveMQ :: MQTT Protocol .......................... SUCCESS [ 18.384 s]
[INFO] ActiveMQ :: JDBC Store ............................. SUCCESS [01:10 min]
[INFO] ActiveMQ :: LevelDB Store .......................... SUCCESS [22:59 min]
[INFO] ActiveMQ :: Generic JMS Pool ....................... SUCCESS [ 18.379 s]
[INFO] ActiveMQ :: Pool ................................... SUCCESS [  0.640 s]
[INFO] ActiveMQ :: RA ..................................... SUCCESS [ 41.083 s]
[INFO] ActiveMQ :: Spring ................................. SUCCESS [ 49.455 s]
[INFO] ActiveMQ :: Console ................................ SUCCESS [ 16.501 s]
[INFO] ActiveMQ :: Partition Management ................... SUCCESS [  0.615 s]
[INFO] ActiveMQ :: Runtime Configuration .................. SUCCESS [02:44 min]
[INFO] ActiveMQ :: Tooling ................................ SUCCESS [  0.022 s]
[INFO] ActiveMQ :: JUnit Rule ............................. SUCCESS [  3.690 s]
[INFO] ActiveMQ :: Unit Tests ............................. SUCCESS [01:57 min]
[INFO] ActiveMQ :: HTTP Protocol Support .................. SUCCESS [02:34 min]
[INFO] ActiveMQ :: AMQP ................................... SUCCESS [ 19.206 s]
[INFO] ActiveMQ :: Camel .................................. SUCCESS [12:18 min]
[INFO] ActiveMQ :: All JAR bundle ......................... SUCCESS [01:19 min]
[INFO] ActiveMQ :: Log4j Appender ......................... SUCCESS [  0.409 s]
[INFO] ActiveMQ :: Apache Karaf ........................... SUCCESS [01:14 min]
[INFO] ActiveMQ :: ConnectionFactory ...................... SUCCESS [ 12.248 s]
[INFO] ActiveMQ :: RAR .................................... SUCCESS [ 13.692 s]
[INFO] ActiveMQ :: Run Jar ................................ SUCCESS [  0.456 s]
[INFO] ActiveMQ :: Shiro .................................. SUCCESS [ 22.035 s]
[INFO] ActiveMQ :: Memory Usage Test Plugin ............... SUCCESS [ 56.830 s]
[INFO] ActiveMQ :: Performance Test Plugin ................ SUCCESS [  2.047 s]
[INFO] ActiveMQ :: StartUp/Stop Plugin .................... SUCCESS [  6.151 s]
[INFO] ActiveMQ :: Web .................................... SUCCESS [ 33.697 s]
[INFO] ActiveMQ :: OSGi bundle ............................ SUCCESS [ 51.578 s]
[INFO] ActiveMQ :: Blueprint .............................. SUCCESS [ 19.883 s]
[INFO] ActiveMQ :: Web Demo ............................... SUCCESS [ 28.383 s]
[INFO] ActiveMQ :: Web Console ............................ SUCCESS [ 54.491 s]
[INFO] ActiveMQ :: Karaf Integration Tests ................ SUCCESS [08:01 min]
[INFO] ActiveMQ :: Integration Test :: Spring 3.1 ......... SUCCESS [ 26.400 s]
[INFO] ActiveMQ :: Assembly ............................... SUCCESS [02:19 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:08 h
[INFO] Finished at: 2017-08-05T15:45:18+08:00
[INFO] Final Memory: 149M/608M
[INFO] ------------------------------------------------------------------------

表示解壓完成了碍讯,此時進入assembly/target目錄悬蔽,可以看到bin包,這個bin包就是一般官網(wǎng)上提供的bin包了捉兴,直接解壓以后運行bin/activemq start就可以啟動AMQ了蝎困。

PS:第一次編譯完,該下的jar包都下完了轴术,第二次編譯的耗時是3分40s难衰。

Eclipse導入MVN項目

首先在解壓目錄下執(zhí)行

$ mvn eclipse:eclipse

再次開始了漫長的下載……成功后出現(xiàn)類似剛才編譯好的輸出。然后在Eclipse中選擇import->Existing Maven Projects



最后Eclipse中會出現(xiàn)類似下面的結構



就可以開始正式讀源碼了逗栽。

下一步做什么

我要發(fā)個朋友圈慶祝一下……
然后開始從連接開始一步步看看可以怎么改源碼盖袭。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市彼宠,隨后出現(xiàn)的幾起案子鳄虱,更是在濱河造成了極大的恐慌,老刑警劉巖凭峡,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拙已,死亡現(xiàn)場離奇詭異,居然都是意外死亡摧冀,警方通過查閱死者的電腦和手機倍踪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來索昂,“玉大人建车,你說我怎么就攤上這事〗凡遥” “怎么了缤至?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長康谆。 經(jīng)常有香客問我领斥,道長,這世上最難降的妖魔是什么沃暗? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任月洛,我火速辦了婚禮,結果婚禮上描睦,老公的妹妹穿的比我還像新娘膊存。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布隔崎。 她就那樣靜靜地躺著今艺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爵卒。 梳的紋絲不亂的頭發(fā)上虚缎,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音钓株,去河邊找鬼实牡。 笑死,一個胖子當著我的面吹牛轴合,可吹牛的內容都是我干的创坞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼受葛,長吁一口氣:“原來是場噩夢啊……” “哼题涨!你這毒婦竟也來了?” 一聲冷哼從身側響起总滩,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤纲堵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闰渔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體席函,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年冈涧,在試婚紗的時候發(fā)現(xiàn)自己被綠了茂附。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡督弓,死狀恐怖何之,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情咽筋,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布徊件,位于F島的核電站奸攻,受9級特大地震影響,放射性物質發(fā)生泄漏虱痕。R本人自食惡果不足惜睹耐,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望部翘。 院中可真熱鬧硝训,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纵刘,卻和暖如春邀窃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背假哎。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工瞬捕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舵抹。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓肪虎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惧蛹。 傳聞我的和親對象是個殘疾皇子扇救,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,095評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)赊淑,斷路器爵政,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 有一次跟兩個閨蜜見面一起吃飯钾挟,其中一個前一天晚上打電話動不動就損我長得黑,結果第二天這家伙見到我就一直在說我變白了...
    冰雅樂閱讀 244評論 0 0
  • 我們是凡人饱岸,是平常人掺出,是普通人。所有人都是苫费,無一例外汤锨。普通這個詞怎么理解? 對于其它生物來說百框,所有的人類都是普通闲礼。...
    小霽桃源閱讀 328評論 1 6
  • 【漁父辭】 屈原既放,游於江潭铐维,行吟澤畔柬泽, 顏色憔悴,形容枯槁嫁蛇。 漁父見而問之曰: “子非三閭大夫與锨并?何故至於斯!...
    肖三羊閱讀 1,276評論 2 5