虽然ActiveMQ提供了发布版本,但是建议同学们自己下载源代码编译,以后万一有坑,还可以尝试自己改改源码。 1.1 https://github.com/apache/activemq/releases 到这里下载最新的release版源码(当前最新版本为5.13.2),并解压到某个目录(以下用$ACTIVEMQ_HOME代替解压根目录) 1.2 编译
编译成功后,在$ACTIVEMQ_HOME/assembly/target下会生成可xxx.bin.tar.gz的可执行文件压缩包
二、启动 将编译后得到的xxx.bin.tar.gz解压,然后执行
后面的可选参数还有 status、restart、stop、list等,不清楚的地方,直接 --help 查看。
三、管理界面 启动成功后,可以浏览 http://localhost:8161/admin/ 默认用户名、密码:admin/admin 管理界面是用jetty做容器的,如果想修改管理界面的端口,可以编辑../conf/jetty.xml,找到下面这一段: <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,可参考下面修改:
四、示例代码 通常消息队列都支持二种模式:基于主题(topic)的发布(Publish)/订阅(Subscribe)模式、点对点(p2p)模式,下面的示例代码为p2p场景。 先给出gradle项目的依赖项 4.1 spring配置文件
View Code
注:brokerURL的地址是在conf/activemq.xml里定义里,见下面的片段
View Code
另外,连接ActiveMQ默认情况下,没有任何安全机制,也就是说任何人只要知道brokerURL都能连接,这显然不安全,可以在activemq.xml里,找到<broker>节点,紧贴它的地方添加下面这段: <broker xmlns="http://activemq./schema/core" brokerName="localhost" dataDirectory="${activemq.data}"> <plugins> <simpleAuthenticationPlugin> <users> <authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/> </users> </simpleAuthenticationPlugin> </plugins> ... </broker> 那么问题来了,这个{activemq.password}的值是在哪里定义的呢?仍然在activemq.xml里找答案,在最开始的地方有一段: 1 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 2 <property name="locations"> 3 <value>file:${activemq.conf}/credentials.properties</value> 4 </property> 5 </bean> 换句话说,conf/credentials.properties这里保存的就是连接activemq的用户名和密码,启用连接的安全机制后,spring的配置文件要做如下调整:
View Code
4.2 生产者代码 发送消息的代码有二种写法: a)利用spring-jms的JmsTemplate b) 利用activeMQ的Producer 这二种方式在性能上差不多,4核8G的mac book pro上,大致每秒可以写入3k+条消息。但是从代码量来讲,明显JmsTemplate的代码量更少,推荐使用。 4.3 消费者代码 当然也可以用JmsTemplate接收消息,但是一般得自己去写while(true)循环,而且默认情况下,上下文如果不是同一个连接,JmsTemplate A发出的消息,JmsTemplate B是接收不到的,所以不建议这种方式。最好参考下面的示例,使用JMS的MessageLisenter去监听消息,这也是JMS规范建议的标准做法: 4.4 嵌入式Broker 类似jetty、tombat之类可以内嵌到代码中启动一样,ActiveMQ也可以直接在代码中内嵌启动,这个很方便一些轻量级的使用场景,示例代码如下:
关于嵌入式Broker的更多细节,可以参考 http://activemq./how-do-i-embed-a-broker-inside-a-connection.html 4.5 消息的自动确认与手动确认 在接收消息时,如果Session使用的是 Session.AUTO_ACKNOWLEDGE,即:
则消息一旦被接受,不论onMessage()里的业务逻辑执行成功与否,消息都将从ActiveMQ的队列里立刻删除。如果希望业务处理成功后,再通知ActiveMQ删除消息,可以改成:
然后onMessage方法调用message.acknowledge手动确认,参考以下代码:
|
|