引言
activeMQ是非常流行的消息中间件,最近在下载完后遇到几个问题,觉得有必要写这篇博文作为记录整个起手的过程。
问题描述
1、下载完activeMQ后,打开bin目录下的activeMQ.bat,无论怎么点击都会闪退?
2、http://localhost:8161/admin 这个地址的用户名和密码如何设置?
问题解决
1、 后面咨询了下大佬,才发现问题很低级,就是其实activeMQ在window下跑是会分32位和64位的,我的电脑系统是64位的windows,需要点击64文件夹下面的activeMQ.bat,ok开启后控制台界面是下面这样的了:
2、在 mq安装目录/conf/jetty.xml中,开启权限控制
同时在/conf/jetty-realm.properties添加用户
启动
解决了上面问题以后就可以开始开心的玩耍了,首先启动mq客户端,然后登陆消息管理页面,默认是在8161这个端口上,点击消息代理管理连接:
会提示你输入用户名和密码,就是上面问题2中设置的:
输入以后,就会跳转到管理页面,具体可以自行点击体验:
比如进入消息队列页面,可以看到列表页有一个名为的消息队列,还有该队列的待消费消息数量,消费消息数量,入列消息数量,出列消息数量等信息。
这边的操作列还提供了手动发送消息的功能:
点击发送以后,在开启的消费端可以收到下面的消息:
考虑到宕机问题,我们一般需要对发送的消息进行持久化,
producer = session.createProducer(destination);producer.setDeliveryMode(DeliveryMode.PERSISTENT); //设置消息持久化sendMsg(session,producer);session.commit();
持久化带来的好处就是,宕机重启好,消息不会丢失,宕机前未消费的消息,可以在重启后,重新消费。
持久化存放的地址在apache-activemq\conf\activemq.xml在越80行会发现默认的配置项:
上面默认使用的是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的应用场景。