ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:2.32MB ,
资源ID:5171516      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5171516.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(JMS详解ActiveMQ.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

JMS详解ActiveMQ.docx

1、JMS详解ActiveMQ基本概念JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。消息模型 Point-to-Point(P2P) Publish/Subscribe(Pub/Sub)即点对点和发布订阅模型P2PP2P模式图涉及到的概念消息队列(Queue)发送者(Sender)接收者(Receiver)每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。P2P的特点每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后

2、,不管接收者有没有正在运行,它不会影响到消息被发送到队列接收者在成功接收消息之后需向队列应答成功如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。Pub/SubPub/Sub模式图涉及到的概念主题(Topic)发布者(Publisher)订阅者(Subscriber)客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。Pub/Sub的特点每个消息可以有多个消费者发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。为了缓和这样严格

3、的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型消息的消费在JMS中,消息的产生和消息是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息。 同步订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞 异步订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。JMS编程模型(1) Connect

4、ionFactory创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。(2) DestinationDestination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。所以,Destination实际上就是两种类型的对象:Queu

5、e、Topic可以通过JNDI来查找Destination。(3) ConnectionConnection表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。(4) SessionSession是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一

6、个事务中。同样,也分QueueSession和TopicSession。(5) 消息的生产者消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。(6) 消息消费者消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创

7、建。当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。(7) MessageListener消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一种MessageListener。企业消息系统的好处我们先来看看下图,应用程序A将Message发送到服务器上,然后应用程序B从服务器中接收A发来的消息,通过这个图我们一起来分析一下JMS的好处:提供消息灵活性松散耦合异步性现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着

8、特殊的角色,所以对于它研究是非常有必要的。我们介绍了消息通信的规范JMS,我们这篇博文介绍一款开源的JMS具体实现ActiveMQ。ActiveMQ是一个易于使用的消息中间件。消息中间件我们简单的介绍一下消息中间件,对它有一个基本认识就好,消息中间件(MOM:Message Orient middleware)。消息中间件有很多的用途和优点:1. 将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外一个模块;2. 负责建立网络通信的通道,进行数据的可靠传送。3. 保证数据不重发,不丢失4. 能够实现跨平台操作,能够为不同操作系统上的软件集成技工数据传送服务MQ首先简单的介绍

9、一下MQ,MQ英文名MessageQueue,中文名也就是大家用的消息队列,干嘛用的呢,说白了就是一个消息的接受和转发的容器,可用于消息推送。下面进入我们今天的主题,为大家介绍ActiveMQ:ActiveMQ简要概述ActiveMQApache ActiveMQ is the most popular and powerful open source messaging and Integration Patterns server.Apache ActiveMQ is fast, supports many Cross Language Clients and Protocols, com

10、es with easy to use Enterprise Integration Patterns and many advanced features while fully supporting JMS 1.1 and J2EE 1.4. ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。下面我们下载一个版本,玩一玩。下载ActiveMQ官方网站:http:/ac

11、tivemq.apache.org/现在ActiveMQ最新的版本是5.11.1,下载挺简单的,就不再截图了。运行ActiveMQ服务下载,解压缩大家现在好之后,将apache-activemq-5.11.1-bin.zip解压缩,我们可以看到它的整体目录结构:从它的目录来说,还是很简单的:bin存放的是脚本文件conf存放的是基本配置文件data存放的是日志文件docs存放的是说明文档examples存放的是简单的实例lib存放的是activemq所需jar包webapps用于存放项目的目录启动ActiveMQ我们了解activemq的基本目录,下面我们运行一下activemq服务,双击bi

12、n目录下的activemq.bat脚本文件或运行自己电脑版本下的activemq.bat,就可以看下图的效果。从上图我们可以看到activemq的存放地址,以及浏览器要访问的地址.3. 测试ActiveMQ默认使用的TCP连接端口是61616, 通过查看该端口的信息可以测试ActiveMQ是否成功启动 netstat -an|find “61616”C:Documents and SettingsAdministratornetstat -an|find 61616 TCP 0.0.0.0:61616 0.0.0.0:0 LISTENING4. 监控ActiveMQ默认启动时,启动了内置的je

13、tty服务器,提供一个用于监控ActiveMQ的admin应用。admin:http:/127.0.0.1:8161/admin/用户名和密码都是adminJMS其实并没有想象的那么高大上,看完这篇博文之后,你就知道什么叫简单,下面直接进入主题。开发环境我们使用的是ActiveMQ 5.11.1 Release的Windows版,官网最新版是ActiveMQ 5.12.0 Release,大家可以自行下载,下载地址。需要注意的是,开发时候,要将apache-activemq-5.11.1-bin.zip解压缩后里面的activemq-all-5.11.1.jar包加入到classpath下面,

14、这个包包含了所有jms接口api的实现。搭建开发环境建立项目我们只需要建立一个java项目就可以了,导入jar包,项目截图:点对点的消息模型,只需要一个消息生成者和消息消费者,下面我们编写代码。编写生产者package com.tgb.activemq;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageProducer;import javax.jms.S

15、ession;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/* * 消息的生产者(发送者) * author liang * */public class JMSProducer /默认连接用户名 private static final String USERNAME = ActiveMQConnection.DEFAULT_USER; /默认连接密码 private static

16、final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD; /默认连接地址 private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL; /发送的消息数量 private static final int SENDNUM = 10; public static void main(String args) /连接工厂 ConnectionFactory connectionFactory; /连接 Connection connection

17、 = null; /会话 接受或者发送消息的线程 Session session; /消息的目的地 Destination destination; /消息生产者 MessageProducer messageProducer; /实例化连接工厂 connectionFactory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL); try /通过连接工厂获取连接 connection = connectionFactory.createConnec

18、tion(); /启动连接 connection.start(); /创建session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); /创建一个名称为HelloWorld的消息队列 destination = session.createQueue(HelloWorld); /创建消息生产者 messageProducer = session.createProducer(destination); /发送消息 sendMessage(session, messageProducer); mit();

19、catch (Exception e) e.printStackTrace(); finally if(connection != null) try connection.close(); catch (JMSException e) e.printStackTrace(); /* * 发送消息 * param session * param messageProducer 消息生产者 * throws Exception */ public static void sendMessage(Session session,MessageProducer messageProducer) th

20、rows Exception for (int i = 0; i JMSProducer.SENDNUM; i+) /创建一条文本消息 TextMessage message = session.createTextMessage(ActiveMQ 发送消息 +i); System.out.println(发送消息:Activemq 发送消息 + i); /通过消息生产者发出消息 messageProducer.send(message); 编写消费者package com.tgb.activemq;import javax.jms.Connection;import javax.jms.Co

21、nnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageConsumer;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/* * 消息的消费者(接受者) * author liang * */pub

22、lic class JMSConsumer private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;/默认连接用户名 private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;/默认连接密码 private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;/默认连接地址 public static void main(String

23、 args) ConnectionFactory connectionFactory;/连接工厂 Connection connection = null;/连接 Session session;/会话 接受或者发送消息的线程 Destination destination;/消息的目的地 MessageConsumer messageConsumer;/消息的消费者 /实例化连接工厂 connectionFactory = new ActiveMQConnectionFactory(JMSConsumer.USERNAME, JMSConsumer.PASSWORD, JMSConsumer

24、.BROKEURL); try /通过连接工厂获取连接 connection = connectionFactory.createConnection(); /启动连接 connection.start(); /创建session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); /创建一个连接HelloWorld的消息队列 destination = session.createQueue(HelloWorld); /创建消息消费者 messageConsumer = session.createCons

25、umer(destination); while (true) TextMessage textMessage = (TextMessage) messageConsumer.receive(100000); if(textMessage != null) System.out.println(收到的消息: + textMessage.getText(); else break; catch (JMSException e) e.printStackTrace(); 运行首先,启动ActiveMQ,如何启动ActiveMQ如何启动,请看第二篇博文。在浏览器中输入:http:/localhost

26、:8161/admin/,然后开始执行:运行发送者,eclipse控制台输出,如下图:此时,我们先看一下ActiveMQ服务器,Queues内容如下:我们可以看到创建了一个名称为HelloWorld的消息队列,队列中有10条消息未被消费,我们也可以通过Browse查看是哪些消息,如下图:如果这些队列中的消息,被删除,消费者则无法消费。我们继续运行一下消费者,eclipse控制台打印消息,如下:此时,我们先看一下ActiveMQ服务器,Queues内容如下:我们可以看到HelloWorld的消息队列发生变化,多一个消息者,队列中的10条消息被消费了,点击Browse查看,已经为空了。点击Acti

27、ve Consumers,我们可以看到这个消费者的详细信息:我们的实例到此就结束了,大家可以自己多点ActiveMQ服务器的内容,进一步熟悉ActiveMQ。总结这篇博文我们实现了点对点的消息模型以及发送的一个同步消息,是不是非常的简单?5. 至此,服务端启动完毕停止服务器,只需要按着Ctrl+Shift+C,之后输入y即可。我们简单说说ActiveMQ特性,网上很多,只是为了保证博文的完整。ActiveMQ特性列表多种语言和协议编写客户端。语言: Java, C, C+, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Not

28、ification,XMPP,AMQP完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA支持通过JDBC和journal提

29、供高速的消息持久化从设计上保证了高性能的集群,客户端-服务器,点对点支持Ajax支持与Axis的整合可以很容易得调用内嵌JMS provider,进行测试什么情况下使用ActiveMQ?多个项目之间集成(1) 跨平台(2) 多语言(3) 多项目降低系统间模块的耦合度,解耦(1) 软件扩展性系统前后端隔离(1) 前后端隔离,屏蔽高安全区其实ActiveMQ的应用还有很多,大家可以上网查查,不再一一举例。总结ActiveMQ并不难,具有很多的优势。环境准备工具JDK1.6或1.7Spring4.1.0ActiveMQ5.11.1Tomcat7.x目录结构所需jar包项目的配置配置Connectio

30、nFactoryconnectionFactory是Spring用于创建到JMS服务器链接的,Spring提供了多种connectionFactory,我们介绍两个SingleConnectionFactory和CachingConnectionFactory。SingleConnectionFactory:对于建立JMS服务器链接的请求会一直返回同一个链接,并且会忽略Connection的close方法调用。CachingConnectionFactory:继承了SingleConnectionFactory,所以它拥有SingleConnectionFactory的所有功能,同时它还新增了缓存功能,它可以缓存Session、MessageProducer和MessageConsumer。我们使用CachingConnectionFactory来作为示例。bean id=connectionFactory class=org.springframework.jms.connection.CachingConnectionF

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1