ActiveMQ使用与部署 (一)

2014-11-24 11:45:08 · 作者: · 浏览: 37

1 JMS与MQ
1.1 JMS
JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,中文称Java消息服务。JMS是一种与厂商无关的 API,用来访问消息收发系统消息;就像JDBC(Java Database Connectivity)可以用来访问许多不同关系数据库一样,JMS则提供同样与厂商无关的访问方法,以访问消息收发服务。
JMS是在Java标准化组织(JCP)内开发的标准(代号JSR 914)。2001年6月25日,发布了JMS 1.0.2b,2002年3月18日发布了JMS1.1,统一了消息域。
JMS规范约定了两种消息方式:P2P(Point To Point)和发布/订阅(Publish/Subscribe)。P2P是用来进行两个节点之间的点对点通信;发布/订阅则是用于一个发布者和多个订阅者之间的通信。
1.2 MQ
MQ是Message Queue的缩写,中文称消息队列,MQ是在消息的传输过程中保存消息的容器。消息管理器在将消息从它的源中继到它的目标时充当中间人;队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
MQ有很多不同厂商和语言实现的产品,如Sun MQ、Microsoft MQ、IBM MQ的等商业产品;Java语言实现的MQ,则有ActiveMQ、基于JMS标准的OpenJMS,以及新近的迁移项目Jafka等开源项目。
1.3 二者关系
JMS是一个用于提供消息服务的技术规范,TA制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。


2 MQ产品介绍

2.1 ActiveMQ
ActiveMQ是Apache的一个顶级Java开源项目,也是目前最流行的,能力强劲的开源消息队列。ActiveMQ是比较老牌的MQ,2004年由Apache开源孵化,2007年成为Apache顶级项目。最新版本已经更新到5.8.0,TA拥有众多特性:
支持Java,C/C++,C#,Ruby,Perl,Python,PHP等多种语言实现客户端和协议。
完全支持企业集成模式。
支持消息分组、虚拟目标及复合目标等高级特性。
完全支持JMS1.1,和J2EE1.4(持久化、事务,及XA消息)。
提供对Spring的支持,可以很容易内嵌到使用Spring的系统中。
通过了常规的J2EE服务器(如TomEE、Geronimo、Jboss、GlassFish、WebLogic等)的测试。
支持多种传输协议,如:in-VM、TCP、SSL、NIO、UDP、multicast、Jgroups、JXTA等。
支持通过JDBC和journal提供高速的消息持久化。
从设计上保证了高性能的集群、客户端-服务器、点对点通信。
支持基于Web的API及其他方式的REST调用。
支持Ajax。
支持CXF和Axis。
支持用作内嵌JMS provider,进行测试。
2.2 其他产品
2.2.1 OpenJMS
OpenJMS是完全基于JMS1.1规范实现的JMS provider,有以下特性:
支持通过JDBC提供消息持久化。
支持Applet。
能够与Jakarta Tomcat这样的Servlet容器结合。
支持RMI、TCP、HTTP与SSL协议。
提供可靠消息传输、事务和消息过滤。
2.2.2 Jafka
基于scala语言开发的分布式发布订阅消息系统Kafka的Java移植版,功能比较简单,但其最大的特色分布式和高性能:
消息持久化非常快,服务端存储消息的开销为O(1)。
基于文件系统,能够持久化TB级的消息而不损失性能。
吞吐量很大,同等机器配置下,Jafka吞吐量比同类MQ均高。
完全的分布式系统,broker、producer、consumer都原生自动支持分布式;自动实现复杂均衡。
内核非常小,内部机制简洁,适合进行内嵌或者二次开发。
消息格式以及通信机制非常简单,适合进行跨语言开发。


3 ActiveMQ的使用

ActiveMQ的使用分为两种,一种是嵌入式,即把ActiveMQ作为内嵌的JMS provider集成到Tomcat或其他Web服务器中;另一种是独立部署,即ActiveMQ单独部署,独立运行,通过ActiveMQ提供的API进行进程外访问。
我们采用独立部署的方式使用ActiveMQ,这样的做法更有利于业务的解耦和工程部署结构的分离;也有利于对ActiveMQ进行配置定制和优化。
我们知道JMS规范中约定了两种消息发送方式:P2P和Publish/Subscribe。根据业务的需求,我们采用P/S方式更为合理,也能更好的发挥ActiveMQ本身的优势。
3.1 消息的发布
// 连接到ActiveMQ服务器
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建主题
Topic topic = session.createTopic("myTopic.messages");
MessageProducer producer = session.createProducer(topic);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

while(true) {
TextMessage message = session.createTextMessage();
message.setText("TIME:" + (new Date()).toLocaleString());
// 发布主题消息
producer.send(message);
System.out.println("Sent message: " + message.getText());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
3.2 消息的订阅
// 连接到ActiveMQ服务器
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)