前几天和AMQ对接的模块的同事说想学AMQ,因为总觉得AMQ有一些可以优化的点,她想看看源码。让我想起在使用AMQ时,受限甚多,可以的话,也最好研究一下源码,看看能不能修改一些代码为项目所用。
说实话,作为一个十几年的开源软件,AMQ的源码部分一直是我挺害怕去触碰的,每次看着几百个java文件我就开始懵圈。但是开始接触程序设计也几年了,开源软件的源码,特别是这种成熟的源码,一定要尝试去钻研,才能让自己的水平得到提高。想想其实这也是分阶段的,一开始学着用,了解深入以后尝试写插件,最后开始改源码。
对于AMQ来说,有几个优化点是我很早就想改的:
- AMQ建立连接时无法指定本地IP。但是其实SOCKET接口是可以指定本地IP的。这个功能的限制导致了项目组做了一整套功能来定义客户端的真实IP。
- 在系统时间改变时,Failover机制生效,MQ重建连接以后,consumer.recieve()方法里有个sleep(),在时间往过去跳转的时候(比如从10点跳回当日0点),receive()的sleep()会等待极长的时间(10-0=10个小时),这样整个客户端就卡死了。
- 设置MessageTTL(消息在集群中能经过的服务器数量)为1时,经常出现消息卡在服务器上的情况,只能设置MessageTTL=2,但是这样使用TOPIC的时候,就会发现消息会在集群内被传播N次,网络流量大增。
————————分割线————————
开源软件的二次开发,应该有以下几个步骤:
1、读源码修改源码
2、编译形成bin文件
3、安装并测试
源码好找,头疼的是不知道该怎么编译,怎么从源码构建出实际可执行的程序。从网上找了下资料,整理并且实践如下:
所需的环境:JDK1.7(JDK1.8),MAVEN 3.5
Maven的安装
- 从Maven的官网下载apache-maven-3.5.0-bin.zip,下载地址为
http://maven.apache.org/download.cgi - 由于使用mac,解压后需要配置环境变量,mac的环境变量配置地址为~/.bash_profile,需要配置MAVEN_HOME和PATH
MAVEN_HOME=/Users/code/apache-maven-3.5.0
PATH=$MAVEN_HOME/bin:$PATH - 配置完成后执行一下
$ 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中会出现类似下面的结构
就可以开始正式读源码了。
下一步做什么
我要发个朋友圈庆祝一下……
然后开始从连接开始一步步看看可以怎么改源码。