一、ActiveMQ的介绍?
1.JMS基础概念
JMS(java Message Service) 即使java消息服务,它提供标准的产生、发送、接收的接口简化企业应用开发,它支持两种消息通信模型:点到点(point-to-point)(P2P) 模型和发布/订阅模型。P2P模型规定了一个消息只能有一个接受者,Pub/Sub 模型允许一个消息可以有多个接受者。
对于点到点模型,消息生产者产生一个消息后,把這个消息发送到一个Queue(队列)
中,然后消息接收者再从這个Queue中读取数据,一旦消息被接受者读取之后,他就在Queue中消失了,所以一个消息只能被一个接受者消费。
与点到点模型不同,发布/订阅模型中,消息生产者产生一个消息后把這个消息发送到一个Topic中,這个Topic可以同时有多个接受者在监听,当一个消息到达這个Topic之后,所有消息接受者都会收到這个消息。
2.编程的结构
2.1消息产生者向JMS发送消息步骤如下
(1)创建连接使用的工厂类JMS ConnectionFactory
(2)使用管理对象JMS ConnectionFactory建立连接Connection
(3)使用连接Connection建立会话Session
(4)使用会话Session和管理对象Destination 创建消息生产者MessageSender
(5)使用消息生产者MessageSender发送消息
2.2消息消费者从JMS接收消息的步骤如下
(1)创建连接使用的工厂类JMS ConnectionFactory
(2)使用管理对象JMS ConnectionFactory建立连接Connection
(3)使用连接建立会话Session
(4)使用会话Session和管理对象Destination创建消息消费者MessageReceiver
(5)使用消息消费者MessageReceiver接受消息,需要用setMessageListener将MessageListener接口绑定到MessageReceiver
消息消费者必须实现了MessageListener接口,需要定于onMessage时间方法。
3.ActiveMQ的下载地址:
下载地址:http://activemq.apache.org/download.html
下载到本地的目录结构为:
进入bin目录下
根据自己的系统位数来执行目录下的
双击让他跑起来,效果如下
二、ActiveMQ能干嘛,好处是什么
activemq有自己的特点和优势:
(1)activemq可以很好的运行在任何JVM上,而不只是集成到JBoss的应用服务器中;
(2)activemq支持大量的跨语言客户端;
(3)activemq支持许多不同的协议,如Ajax,REST,Stomp,OpenWire,XMPP
(4)activemq支持许多高级功能,例如MessageGroups,ExclusiveConsumer,CompositeDestinations
(5)AdvisoryMessage
(6)activemq支持可靠连接并且具有可配置的自动重连接
(7)activemq对spring有很好的支持
(8)activemq支持跨网络的分布式目的地
(9)activemq是速度非常快;一般要比jbossmq快10倍
三、ActiveMQ一般应用到什么场景
ActiveMQ 使用场景
1.非均匀应用集成
ActiveMQ 中间件用Java语言编写,因此自然提供Java客户端 API。但是ActiveMQ 也为C/C++、.NET、Perl、PHP、Python、Ruby 和一些其它语言提供客户端。在你考虑如何集成不同平台不同语言编写应用的时候,ActiveMQ 拥有巨大优势。在这样的例子中,多种客户端API通过ActiveMQ 发送和接受消息成为可能,无论使用的是什么语言。此外,ActiveMQ 还提供交叉语言功能,该功能整合这种功能,无需使用远程过程调用(RPC)确实是个优势,因为消息协助应用解耦。
2.作为RPC的替代
应用使用RPC分格同步调用十分普遍。假设大多数客户端服务器应用使用RPC,包括ATM、大多数WEB应用、信用卡系统、销售点系统等等。尽管很多系统很成功,转换使用异步消息可以带来很多好处,而且也不会放弃响应保证。系统依赖同步需求典型地限制了扩展,因为最终需求将开始起作用,从而放慢整个系统。取而代之这种不好的体验,使用异步消息,附加的消息接收器可以轻松添加,假设你的应用可以解耦。
3.两个应用之间解耦
正如之前讨论的,紧耦合架构可以导致很多问题,尤其是如果他们是分布的。松耦合架构,在另一方面,证实了更少的依赖性,能够更好地处理不可预见的改变。你不见可以在系统中改变组件而不影响整个系统,而且组件交互也相当的简单。取代使用同步方案的组件交互,组件利用异步通信。这样的松耦合遍及系统被称之为事件驱动架构(EDA)。
4.作为事件驱动架构的主干
在之前的观点中,解耦、异步风格架构允许软件本身进一步扩展(水平的可扩展性),而不是依赖硬件的可扩展性(垂直的可扩展)。想象一下一种难以置信的流量、电子商务网站像亚马逊。但一个用户在亚马逊上购买,有许多分开的阶段贯穿,订单需要履行包括订单配置、创建发票、支付流程、订单完成、运输等。然而,但一个用户实际上提交了一个订单,用户立即得到一个页面说明,“感谢您的订单”不仅如此,没有任何延迟。用户也收到了订单已经收到的邮件说明,订单配置流程由亚马逊雇佣就是个很好的例子,第一步在一种更大的、异步流程中。每一个订单步骤直接由分开的服务奋力地处理。但用户下了订单,异步调用提交订单,但是全部订单流程不会落后于通过网页浏览器进行的同步调用。反之,订单被接受并立即被确认。这个流程中剩余的步骤一步地被处理。如果发生了问题。组织流程进行,用户会被通知。这样的异步流程提供大量的可扩展性。
5.改善应用可扩展性
许多应用利用事件驱动架构,为了提供大量的可扩展性,包括像电子商务、*、制造业和在线游戏等领域。使用异步消息在业务领域分离一个应用,许多其它可能性开始合并。考虑使用服务为特定任务设计应用的能力。这正是面向服务架构(SOA)的主干。每一个服务实现一个独立的功能,而且只是那个功能。应用通过这些服务构成来创建,在服务间使用异步消息实现通信。这种风格的应用设计被称之为复杂事件处理(CEP)。使用CEP,系统中组件之间的交互可以被进一步的分析跟踪。在考虑异步消息在系统的组件之间添加一种迂回的时候,这些可能性是无止境的。
四、连接使用案例
生产者:
package com.xuwei.activemq; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; public class Sender { private static final int SEND_NUMBER = 5; public static void main(String[] args) { // ConnectionFactory :连接工厂,JMS 用它创建连接 ConnectionFactory connectionFactory; // Connection :JMS 客户端到JMS Provider 的连接 Connection connection = null; // Session: 一个发送或接收消息的线程 Session session; // Destination :消息的目的地;消息发送给谁. Destination destination; // MessageProducer:消息发送者 MessageProducer producer; // TextMessage message; // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616"); try { // 构造从工厂得到连接对象 connection = connectionFactory.createConnection(); // 启动 connection.start(); // 获取操作连接 session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置 destination = session.createQueue("FileQueue"); // 得到消息生成者【发送者】 producer = session.createProducer(destination); // 设置不持久化,此处学习,实际根据项目决定 producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // 构造消息,此处写死,项目就是参数,或者方法获取 sendMessage(session, producer); session.commit(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != connection) connection.close(); } catch (Throwable ignore) { } } } public static void sendMessage(Session session, MessageProducer producer) throws Exception { for (int i = 1; i <= SEND_NUMBER; i++) { TextMessage message = session .createTextMessage("ActiveMq 发送的消息" + i); // 发送消息到目的地方 System.out.println("发送消息:" + "ActiveMq 发送的消息" + i); producer.send(message); } } } |
可以看到ActiveMQ以成功的向FileQueue队列发送了五条数据
Web端使用websocket连接ActiveMQ:
需要导入:stop.js
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="stomp.js"></script> </head> <body> <script type="text/javascript"> var url = "ws://localhost:61614/stomp"; var login = "admin"; var passcode = "admin"; //监听的队列 //需要和发送者的发送的队列名称一致否则无法接受到数据 destination = "FileQueue"; client = Stomp.client(url); var onconnect = function(frame) { client.subscribe(destination, function(message) { console.log(message.body); alert(message.body); }); }; client.connect(login, passcode, onconnect); </script> </body> </html> |
效果如下: