前幾天和AMQ對接的模塊的同事說想學AMQ,因為總覺得AMQ有一些可以優(yōu)化的點袍镀,她想看看源碼。讓我想起在使用AMQ時冻晤,受限甚多苇羡,可以的話,也最好研究一下源碼鼻弧,看看能不能修改一些代碼為項目所用设江。
說實話,作為一個十幾年的開源軟件攘轩,AMQ的源碼部分一直是我挺害怕去觸碰的叉存,每次看著幾百個java文件我就開始懵圈。但是開始接觸程序設計也幾年了度帮,開源軟件的源碼歼捏,特別是這種成熟的源碼,一定要嘗試去鉆研笨篷,才能讓自己的水平得到提高瞳秽。想想其實這也是分階段的,一開始學著用率翅,了解深入以后嘗試寫插件练俐,最后開始改源碼。
對于AMQ來說安聘,有幾個優(yōu)化點是我很早就想改的:
- AMQ建立連接時無法指定本地IP痰洒。但是其實SOCKET接口是可以指定本地IP的旧找。這個功能的限制導致了項目組做了一整套功能來定義客戶端的真實IP庄吼。
- 在系統(tǒng)時間改變時,F(xiàn)ailover機制生效话告,MQ重建連接以后念颈,consumer.recieve()方法里有個sleep()泉粉,在時間往過去跳轉的時候(比如從10點跳回當日0點),receive()的sleep()會等待極長的時間(10-0=10個小時),這樣整個客戶端就卡死了嗡靡。
- 設置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的安裝
- 從Maven的官網(wǎng)下載apache-maven-3.5.0-bin.zip仇参,下載地址為
http://maven.apache.org/download.cgi - 由于使用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 - 配置完成后執(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ā)個朋友圈慶祝一下……
然后開始從連接開始一步步看看可以怎么改源碼盖袭。