你的位置:首页 > Java教程

[Java教程]ActiveMQ笔记:编译、安装、示例代码


一、编译

虽然ActiveMQ提供了发布版本,但是建议同学们自己下载源代码编译,以后万一有坑,还可以尝试自己改改源码。

1.1 https://github.com/apache/activemq/releases 到这里下载最新的release版源码(当前最新版本为5.13.2),并解压到某个目录(以下用$ACTIVEMQ_HOME代替解压根目录)

1.2 编译

cd $ACTIVEMQ_HOMEmvn clean install -Dmaven.test.skip=true

编译成功后,在$ACTIVEMQ_HOME/assembly/target下会生成可xxx.bin.tar.gz的可执行文件压缩包

 

二、启动

将编译后得到的xxx.bin.tar.gz解压,然后执行 

tar -zxvf apache-activemq-5.13.2-bin.tar.gzcd apache-activemq-5.13.2/bin./activemq start

后面的可选参数还有 status、restart、stop、list等,不清楚的地方,直接 --help 查看。

 

三、管理界面

启动成功后,可以浏览 http://localhost:8161/admin/

默认用户名、密码:admin/admin

管理界面是用jetty做容器的,如果想修改管理界面的端口,可以编辑../conf/jetty.

<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">  <!-- the default port number for the web console -->  <property name="host" value="0.0.0.0"/>  <property name="port" value="8161"/></bean>

用户名/密码是在 ../conf/jetty-realm.properties 里,比如要增加一个管理员jimmy/123456,可参考下面修改:

admin: admin, adminjimmy: 123456, adminuser: user, user 

  

四、示例代码

通常消息队列都支持二种模式:基于主题(topic)的发布(Publish)/订阅(Subscribe)模式、点对点(p2p)模式,下面的示例代码为p2p场景。

4.1 spring配置文件

 1 <??> 2 <beans ="http://www.springframework.org/schema/beans" 3     ="http://www.w3.org/2001/ 4     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5  6   <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> 7     <property name="connectionFactory"> 8       <bean class="org.apache.activemq.ActiveMQConnectionFactory"> 9         <!--broker服务的地址-->10         <property name="brokerURL" value="tcp://localhost:61616"/>11         <!--默认值为1000,如果不需要这么大,可以调小-->12         <property name="maxThreadPoolSize" value="100"/>13       </bean>14     </property>15   </bean>16 17   <bean id="dest" class="org.apache.activemq.command.ActiveMQQueue">18     <!--队列名称-->19     <property name="physicalName" value="myQueue"/>20   </bean>21 22   <bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate">23     <property name="connectionFactory" ref="jmsFactory"/>24     <!--默认的队列-->25     <property name="defaultDestination" ref="dest"/>26     <!--接收超时时间10秒-->27     <property name="receiveTimeout" value="10000"/>28   </bean>29 30 </beans>

View Code

注:brokerURL的地址是在conf/activemq.

1 <transportConnectors>2 <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->3 <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>4 <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>5 <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>6 <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>7 <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>8 </transportConnectors>

View Code

4.2 生产者代码

发送消息的代码有二种写法:

a)利用spring-jms的JmsTemplate

package com.cnblogs.yjmyzz.activemq;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPath

b) 利用activeMQ的Producer

package com.cnblogs.yjmyzz.activemq;import org.apache.activemq.command.ActiveMQQueue;import org.apache.activemq.pool.PooledConnectionFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPath

这二种方式在性能上差不多,4核8G的mac book pro上,大致每秒可以写入3k+条消息。但是从代码量来讲,明显JmsTemplate的代码量更少,推荐使用。

4.3 消费者代码

当然也可以用JmsTemplate接收消息,但是一般得自己去写while(true)循环,而且默认情况下,上下文如果不是同一个连接,JmsTemplate A发出的消息,JmsTemplate B是接收不到的,所以不建议这种方式。最好参考下面的示例,使用JMS的MessageLisenter去监听消息,这也是JMS规范建议的标准做法:

package com.cnblogs.yjmyzz.activemq;import org.apache.activemq.command.ActiveMQQueue;import org.apache.activemq.pool.PooledConnectionFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPath