JMS消息服务-ActiveMQ
2015年7月28日
1 JMS消息服务
目标:网络或进程间的消息异步、同步通信、点对点或发布模式通信。将消息的收、发方解耦。
原理:Java提供JMS(Java Message Service)作为消息服务的规范,可以有不同的实现方法。发送方将消息发向JMS服务器,由JMS服务器处理消息后再发送到收取方。
参考:http://my.oschina.net/zmf/blog/368017
方法:开源消息服务软件,ActiveMQ。
2 方法:ActiveMQ服务器
2.1 打开服务器:bin\activemqstart。
注意:有可能出现VM创建错误,这是由于ActiveMQ默认需要1G内存,如果物理内存不足,则创建失败。可能通过释放内存,达到1G再启动。或者修改ActiveMQ的内存配置(推荐)。
启动成功后出现下图所示:access to all MBeans is allowed。
2.2 修改内存配置:activemq.bat。
修改第80行-Xms -Xmx为512m或更少。
参考:http://activemq.apache.org/javalangoutofmemory.html
2.3 关闭服务器:ctrl+C
2.4 打开WEB 控制台:localhost:8161,可以看到控制台和示例程序。
示例程序在webapps-demo/demo中,需要从其中copy到webapps中。
3 方法:消息收发模式:点对点,订阅
由消息服务器管理消息,收发双方独立联系服务器,消息的生命周期由消息服务器管理。
3.1 点对点:单线联系。
双方完全无关,不须维持在线状态。
3.2 订阅:广播。
临时订阅时,订阅者须维持在线状态。
持久订阅时,双方完全无关,不须维持在线状态。
3.3 消息持久化:存储消息,重启后消息依然存在。
可以指定数据库。
参考:http://bbs.paris8.org/viewthread.php?tid=4252
3.4 集群:扩展服务器
可以使用集群服务器扩展性能。
参考:http://blog.evercoding.net/2014/07/17/activemq-note/
4 方法:收发消息
目标:与消息服务器进行消息收发。
原理:收/发方通过与服务器建立连接,然后以session为单位建立单线程消息收/发。
方法:设置服务器地址和类型、编写收发逻辑。
参考:
4.1 设置服务器:设置服务器的连接地址。
目标:配置mq服务器能够提供服务的IP地址。
方法:修改conf/activemq.xml中<transportConnectors>的连接选项,默认是tcp://0.0.0.0:61616。
具有多种类型的连接,如tcp,udp,http等。
参考:http://activemq.apache.org/configuring-transports.html
示例:添加新的tcp连接服务tcp://0.0.0.0:61618。
<transportConnectors>
<!-- DOS protection, limitconcurrent connections to 1000 and frame size to 100MB -->
<transportConnectorname="openwire"uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="tcp"uri="tcp://0.0.0.0:61618?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnectorname="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnectorname="stomp"uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnectorname="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnectorname="ws"uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
4.2 建立连接:Connection。
4.2.1配置连接工厂:连接使用ConnectionFactory配置连接服务器,并由其创建连接。使用完成之后要关闭连接服务器和连接。
4.2.2建立连接:使用连接工厂生成一个连接。并使用start()启动连接。
只有启动连接才真正的建立连接。
4.2.3示例
//create connection
ConnectionFactory cf=newActiveMQConnectionFactory("tcp://localhost:61618");
Connection conn = cf.createConnection();
conn.start();
4.3 创建会话:Session,独立的消息队列。支持回滚。
4.3.1创建会话:使用连接创建一个独立的会话。createSession(transacted,acknowledgeMode)。
会话将指定是否支持事务,如果支持(true)则忽略a