一、背景
中间件
由于业务的不同、技术的发展、硬件和软件的选择有所差别,导致了异构组件或应用并存的局面。要使这些异构的组件协同工作,一个有效的方式就是提供一个允许它们进行通信的层,该层即为中间件。
在概念上,中间件位于应用程序层与平台层(操作系统和底层网络服务)之间。
MOM
全称:Message-Oriented Middleware 中文:面向消息的中间件。
MOM通信模型:
MOM模型中的四个基本元素:消息传递提供者、目的地、客户端(发送方或接收方)、消息。
发送方客户端将消息发送到消息提供者维护的目的地,这些消息一直被保留直到接收方客户端将消息取出。
JMS
全称:Java Message Service 中文:Java消息服务。
JMS是Java的一套API标准,最初的目的是为了使应用程序能够访问现有的MOM系统(客户端通过JMS访问消息提供者);后来被许多现有的MOM供应商采用,并实现为MOM系统。
基于JMS实现的MOM,又被称为JMS Provider。
ActiveMQ
Apache出品,完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。
它有很多功能、特色,所以它的详细信息很复杂。但是基于这一刻,我们只需要知道两件事:(1) 它是MOM;(2) 它是JMS的一个实现。
ActiveMQ使用java写的,所以天然跨平台,windows,各种类Unix系统都可运行,只需要下载对应的分发包即可。
二、ActiveMQ安装启动
1、打开浏览器,访问官网
2、下载最新的版本,当前最新版本,根据ActiveMQ需要安装的操作系统选择性下载对应的版本,这里我选择Windows版本,然后点击下载ZIP包
3、下载完成以后,将zip文件解压到D盘下,解压后的目录结构如下图所示:
4、在启动ActiveMQ前,首先要确保服务器上已经安装和配置好JDK,并且JDK的版本要满足ActiveMQ的要求
cmd java -version
5、接下来我们进入到D:apache-activemq-5.15.5in,如下图所示:
6、根据服务器上操作系统的版本,选择进入到win32还是win64,这里选择进入win64目录,然后双击activemq.bat,这时activemq就启动起来了,成功启动以后打印的日志如下图所示:
也可以安装为服务启动,执行bin>win64目录下面的InstallService.bat就可以了。
7、打开浏览器,输入http://localhost:8161/admin/ ,弹出一个windows安全提示框,提示输入activemq的用户名和密码,如下图所示:
8、接下来我们打开D:apache-activemq-5.15.5conf这个目录,找到jetty-realm.properties文件(该文件保存着用户名和密码信息)
10、角色信息的定义放在D:apache-activemq-5.15.5conf下的jetty.xml文件中,如下图所示:
11、 我们知道了角色定义的位置,角色对应的用户名和密码后,我们就可以使用默认的用户名admin和默认的密码admin来登录系统,如下图所示:
12、 登录成功以后,就可以看到activemq的主页了,如下图所示:
三、后台管理页面
Queues是队列方式消息。Topics是主题方式消息。Subscribers是消息订阅监控查询。Connections可以查看链接数,分别可以查看xmpp、ssl、stomp、openwire、ws和网络链接。Network是网络链接数监控。Send可以发送消息数据。
Numbers of Pending Messages: 待处理的消息数量
Messages Enqueued:在排队的消息
Messages Denqueued:已出队列的消息
Send中可以手动发数据到队列
注:队列名称是区分大小写的。
四、启动报错
1、cmd中启动时看到错误:Failed to start Apache ActiveMQ......
修改conf->activemq.xml 配置文件
<transportConnectors> <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </transportConnectors>
修改为:
<transportConnectors> <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> <transportConnector name="openwire" uri="tcp://127.0.0.1:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="amqp" uri="amqp://127.0.0.1:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="stomp" uri="stomp://127.0.0.1:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="ws" uri="ws://127.0.0.1:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </transportConnectors>
2、指定Java路径问题
运行bat文件是报了个版本的错误,因为自己机器的java_home是指向1.6的,所以只能在配置文件里面另外指定java_home,但是找了好久也试了好久,和平常的set java_home=... 好像不管用。
最后自己找到了binwin64路径下的wrapper.conf文件,里面有个
wrapper.java.command=java
改为这样就行了
E:Program FilesJavajdk1.8.0_92injava
五、JMS客户端编程模型
客户端编程模型,是讲如何使用JMS API实现 应用程序和JMS Provider的通信。
消息传送模式又称为消息传送域,JMS API定义了两种模式:PTP和Pub/Sub。
PTP
- 一个Message只能交给一个Receiver;这里的Message像是一个消耗品。
- 只要Queue中有Message,Receiver就能获取到。
Pub/Sub
- 一个Message可以复制多份,交给多个Subscriber。
- 先订阅,再获取 - Subscriber只能获取订阅之后发送到Topic的Message。
编程模型
对象简介
- 连接工厂(ConnectionFactory)
客户端使用连接工厂对象(ConnectionFactory)创建连接。 - 连接(Connection)
连接对象 (Connection) 表示客户端与代理之间的活动连接。创建连接时会分配通信资源并对客户端进行验证。这是一个相当重要的对象,大多数客户端均使用一个连接来完成所有的消息传送。连接支持并发使用:一个连接可由任意数量的生成方和使用方共享。 - 会话(Session)
如果连接代表客户端与代理之间的通信渠道,则会话标记客户端与代理之间的单次对话。会话对象主要用于创建消息、消息生成方和消息使用方。 - 消息(Message)
消息封装一次通信的内容。消息由三部分组成:消息头、属性和主体。 - 消息生成方(MessageProducer)
由Session创建,负责发送Message到目的地。 - 消息使用方(MessageConsumer)
由Session创建,负责从目的地中消费Message。 - 目的地(Destination)
JMS Provider负责维护,用于对Message进行管理的对象。MessageProducer需要指定Destination才能发送消息,MessageReceiver需要指定Destination才能接收消息。
六、更多参考
JMS:(一款开源的JMS具体实现——ActiveMQ。ActiveMQ是一个易于使用的消息中间件。)
JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步
深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
点对点的同步消息模型
深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例