activeMQ是很是流行的消息中间件,最近在下载完后遇到几个问题,以为有必要写这篇博文做为记录整个起手的过程。java
一、下载完activeMQ后,打开bin目录下的activeMQ.bat,不管怎么点击都会闪退?mysql
二、http://localhost:8161/admin 这个地址的用户名和密码如何设置?web
一、 后面咨询了下大佬,才发现问题很低级,就是其实activeMQ在window下跑是会分32位和64位的,个人电脑系统是64位的windows,须要点击64文件夹下面的activeMQ.bat,ok开启后控制台界面是下面这样的了:sql
二、在 mq安装目录/conf/jetty.xml中,开启权限控制数据库
同时在/conf/jetty-realm.properties添加用户apache
解决了上面问题之后就能够开始开心的玩耍了,首先启动mq客户端,而后登录消息管理页面,默认是在8161这个端口上,点击消息代理管理链接:windows
会提示你输入用户名和密码,就是上面问题2中设置的:api
输入之后,就会跳转到管理页面,具体能够自行点击体验:session
好比进入消息队列页面,能够看到列表页有一个名为FirstQueue的消息队列,还有该队列的待消费消息数量,消费消息数量,入列消息数量,出列消息数量等信息。jsp
这边的操做列还提供了手动发送消息的功能:
点击发送之后,在开启的消费端能够收到下面的消息:
考虑到宕机问题,咱们通常须要对发送的消息进行持久化,
producer = session.createProducer(destination); producer.setDeliveryMode(DeliveryMode.PERSISTENT); //设置消息持久化 sendMsg(session,producer); session.commit();
持久化带来的好处就是,宕机重启好,消息不会丢失,宕机前未消费的消息,能够在重启后,从新消费。
持久化存放的地址在apache-activemq\conf\activemq.xml在越80行会发现默认的配置项:
<persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter>
上面默认使用的是kahaDB,是一个基于文件支持事务的消息存储器,是一个可靠,高性能,可扩展的消息存储器,固然咱们还可使用mysql等数据库做为持久化目的地,具体配置(在activeMQ.xml)和web项目中配置数据源如出一辙(须要下载mysql-connector包到activeMQ的lib包下)。
上面说的是点对点方式的持久化,对于订阅和消费模式,其实也有持久化的问题,持续订阅和非持续订阅,是针对“订阅-发布”模式的细分处理策略,在JMS规范中的标准称呼是:Durable-Subscribers和Non-Durable Subscribers。
Durable-Subscribers:是指在“订阅-发布”模式下,即便标记为Durable-Subscribers的订阅者下线了(多是由于订阅者宕机,也多是由于这个订阅者故意下线),“订阅-发布”模式的Topic队列也要保存这些消息(视消息不一样的持久化策略影响,保存机制不同),直到下次这个被标记为Durable-Subscribers的订阅者从新上线,并正确处理这条消息为止。换句话说,标记为Durable-Subscribers的订阅者是否能得到某条消息,和它是否曾经下线没有任何关系。
Non-Durable Subscribers:是指在“订阅-发布”模式下,“订阅-发布”模式的Topic队列不用为这些已经下线的订阅者保留消息。当后者将消息按照既定的广播规则发送给当前在线的订阅者后,消息就能够被标记为“处理完成”。
具体在操做的是以下:
// 建立持久订阅的时候,必需要设置client,不然会报错: // 若是clientID重复(已经存在相同id的活动链接),会报错 // javax.jms.InvalidClientIDException: Broker: localhost - Client: 1 // already connected from tcp://127.0.0.1:2758 connection.setClientID("1"); TopicSession session = connection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE); // 在同一个链接的ClientID下,持久订阅者的名称必须惟一 // javax.jms.JMSException: Durable consumer is in use for client: 1 and // subscriptionName: 11 TopicSubscriber subscriber = session.createDurableSubscriber(topic,"11");
其实activeMQ其实仍是挺简单的,api也很简洁,从目前来看activeMQ支持的五种消息类型来讲(消息类型JMS规范中的消息类型包括TextMessage、MapMessage、ObjectMessage、BytesMessage、和StreamMessage),可作的事情很是多,能够多尝试下,下一篇大概介绍一下activeMQ的应用场景。