其实算不上初识了,工作一年来一直都有接触 mq 相关的东西。但是,从来都是粘贴复制别人的配置代码,却从未认真系统的学习过它,现在线上用 mq 的项目出问题了,老板在后面拿枪指着呢,不得不好好研究下了。
说干就干,先到官网下载 ActiveMQ 安装到本地。如果用 Mac 的化就方便了,直接在终端:brew install activemq,然后根据安装后的提示直接输入:activemq start 启动它,执行启动命令后输出了四行日志,然后就完了!记得之前见过有个网站可以查看 ActiveMQ 的 Queue,Topic,以及一些消息堆积数等数据的,可是启动日志并没有告诉我怎么打开这样的网站。没办法,去官网看文档吧! 现在来到了官网,大眼一瞅,发现右下方的菜单栏里面有个 Using ActiveMQ 5。无须多言,这应该就是我们要找的文档了,先看了再说。 打开这个文档页面,看到了程序员们非常熟悉的 Examples,Getting Started,Hello World 字样。那么就先从 Getting Started 来看吧!
首先是,文档的自我说明:本文档介绍了怎么在 Unix 和 Windows 平台上安装和配置 ActiveMQ。 然后是,安装条件:大概就是需要几十或几百兆的硬盘空间啊,需要先安装 Java,Maven 啊,基本是 Java 菜鸟都能看懂的东西了。 紧接着就是怎么在不同的平台上安装和启动了,刚才在 Mac 上直接用 brew 安装和启动了,这也不废话了! 启动完了,然后又提示我们检测下是否启动成功了,直接检测 ActiveMQ 监听的 61616 端口有没有被监听即可:netstat -an | grep 61616 然后说监控 ActiveMQ 的状态,在这里终于找到了我们需要的查看 ActiveMQ 各项数据的地址:http://localhost:8161/admin,在浏览器中打开 此地址。 就像学开车一样,不能只学打开火让车飞快地跑起来,还应该学会如何安全的让车停下来。找到 ActiveMQ 的安装目录,进入 bin 文件夹后执行:activemq stop。由此可以,刚才使用 brew 安装时,brew 必是把 bin 目录下的 activemq 这个脚本做成了全局可执行命令,所以使用 activemq start 可以直接启动呢!不用多说,现在我直接在当前目录也可以让车停下来:activemq stop,试了一下,确实停下来了! 然后是怎么使用不同的配置,这里我发现说的有两种情况:ActiveMQ 5.8 or older 和 activeMQ 5.9,然后我就查看了下我安装的版本,activemq: stable 5.14.4,尼玛,差距有点大啊!难道文档版本落后那么多?哎,先不管了,等下不行的话再重新安装最新版吧!这里介绍了这两种情况怎么使用其他配置而不是默认配置文件来启动 ActiveMQ,然后我还看到了 Spring Support 和 Configuration section。我的项目就是用的 spring,以前配置都是抄别人的,现在终于可以看看官方指南了,先把这两个链接收藏起来等下都看了。从这里我也明白了,使用 activemq console 启动的话,就可以一直在当前终端里看启动和运行日志了。好了,现在我特别想去看看Hello World 了。
开头说运行完这个例子后,可以做什么什么。。。尼玛,一共五道作业题,我就能看明白最后一道:使用 Topic 代替 Queue,之前我还是稍微明白一点主题和队列的概念的。不管作业了,先去看看现成的例子吧! 自己在 IDEA 里面抄袭了下例子,发现有些 ActiveMQConnectionFactory 类,不是 Java 原生类,刚才最顶端看到了 Initial Configuration guide 来设置 classpath,想必就是教我们怎么把 ActiveMQ 相关的 jar 包导入项目吧!去这个页面看了一下,说有个叫 activemq-all.jar 的全功能包,但是没给下载连接,没办法谷歌一下喽,然后找到了伟大的 Maven 官方仓库,然后找到了跟我安装版本一直的 jar 包,然后下载它,并加入到项目 path 中去。 好了,现在可以愉快地抄例子代码了。 例子抄完了,运行了两边,一知半解的,消息好像是被保存在了项目根目录的 KahaDB 的文件夹下去了,并没有 保存到 ActiveMQ 服务器中,反正我在 localhost:8161 上没看到相关的 Queue。不过例子大概给了一个套路。 发送时:
创建连接工厂
使用连接工厂创建连接(奇怪,不是应该从连接工厂中获取连接的吗?)
启动连接
使用连接创建会话
使用会话创建地址(队列或主题地址。队列或主题为啥要依据会话创建呢?这两者之间有关系吗?不明白,不明白)
使用会话和地址创建消息生产者
设置消息生产者的分发消息的模式
使用会话创建一个文本消息(奇怪,消息这种独立的实体,为啥要依据会话创建呢?不明白,不明白)
使用生产者发送消息
关闭会话
关闭连接
消费时:
- 创建连接工厂
- 使用连接工厂创建连接(奇怪,不是应该从连接工厂中获取连接的吗?)
- 启动连接
- 使用连接创建会话
- 使用会话创建地址(队列或主题地址。队列或主题为啥要依据会话创建呢?这两者之间有关系吗?不明白,不明白)
- 使用会话和地址创建消息消费者
- 消费者接收消息(可以设置一定的超时时间)
- 关闭消费者(为啥消费者还需要关闭??生产者咋不需要关闭呢?)
- 关闭会话
- 关闭连接
看了那么久,稍微有点了解吧!今天先这样吧,回家吃饭了!