ActiveMQ从源码构建

前几天和AMQ对接的模块的同事说想学AMQ,因为总觉得AMQ有一些可以优化的点,她想看看源码。让我想起在使用AMQ时,受限甚多,可以的话,也最好研究一下源码,看看能不能修改一些代码为项目所用。
说实话,作为一个十几年的开源软件,AMQ的源码部分一直是我挺害怕去触碰的,每次看着几百个java文件我就开始懵圈。但是开始接触程序设计也几年了,开源软件的源码,特别是这种成熟的源码,一定要尝试去钻研,才能让自己的水平得到提高。想想其实这也是分阶段的,一开始学着用,了解深入以后尝试写插件,最后开始改源码。

对于AMQ来说,有几个优化点是我很早就想改的:

  1. AMQ建立连接时无法指定本地IP。但是其实SOCKET接口是可以指定本地IP的。这个功能的限制导致了项目组做了一整套功能来定义客户端的真实IP。
  2. 在系统时间改变时,Failover机制生效,MQ重建连接以后,consumer.recieve()方法里有个sleep(),在时间往过去跳转的时候(比如从10点跳回当日0点),receive()的sleep()会等待极长的时间(10-0=10个小时),这样整个客户端就卡死了。
  3. 设置MessageTTL(消息在集群中能经过的服务器数量)为1时,经常出现消息卡在服务器上的情况,只能设置MessageTTL=2,但是这样使用TOPIC的时候,就会发现消息会在集群内被传播N次,网络流量大增。

————————分割线————————

开源软件的二次开发,应该有以下几个步骤:
1、读源码修改源码
2、编译形成bin文件
3、安装并测试

源码好找,头疼的是不知道该怎么编译,怎么从源码构建出实际可执行的程序。从网上找了下资料,整理并且实践如下:

所需的环境:JDK1.7(JDK1.8),MAVEN 3.5

Maven的安装

  1. 从Maven的官网下载apache-maven-3.5.0-bin.zip,下载地址为
    http://maven.apache.org/download.cgi
  2. 由于使用mac,解压后需要配置环境变量,mac的环境变量配置地址为~/.bash_profile,需要配置MAVEN_HOME和PATH
    MAVEN_HOME=/Users/code/apache-maven-3.5.0
    PATH=$MAVEN_HOME/bin:$PATH
  3. 配置完成后执行一下
    $ 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的官网地址下载源码,我下的是当前最新的5.15.0版本。
activemq-parent-5.15.0-source-release.zip
解压到本地后,使用terminal进入该目录,而后执行

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

就会直接开始下载各种jar包到本地了。
tip:中途如果出现build error,多重复几次上面的命令。
下载完到编译的步骤的时候,出现了一个报错

[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: 无效的目标发行版: 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分钟。。。。),出现了如下的提示

[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包就是一般官网上提供的bin包了,直接解压以后运行bin/activemq start就可以启动AMQ了。

PS:第一次编译完,该下的jar包都下完了,第二次编译的耗时是3分40s。

Eclipse导入MVN项目

首先在解压目录下执行

$ mvn eclipse:eclipse

再次开始了漫长的下载……成功后出现类似刚才编译好的输出。然后在Eclipse中选择import->Existing Maven Projects



最后Eclipse中会出现类似下面的结构



就可以开始正式读源码了。

下一步做什么

我要发个朋友圈庆祝一下……
然后开始从连接开始一步步看看可以怎么改源码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,050评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,495评论 18 139
  • 有一次跟两个闺蜜见面一起吃饭,其中一个前一天晚上打电话动不动就损我长得黑,结果第二天这家伙见到我就一直在说我变白了...
    冰雅乐阅读 234评论 0 0
  • 我们是凡人,是平常人,是普通人。所有人都是,无一例外。普通这个词怎么理解? 对于其它生物来说,所有的人类都是普通。...
    小霁桃源阅读 317评论 1 6
  • 【渔父辞】 屈原既放,游於江潭,行吟泽畔, 颜色憔悴,形容枯槁。 渔父见而问之曰: “子非三闾大夫与?何故至於斯!...
    肖三羊阅读 1,247评论 2 5