您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > ActiveMQ学习笔记
一.ACTIVEMQ是什么ActiveMQ是Apache出品,最流行的,能力强劲的开源消息中间件,应用中引入中间件的好处是减少服务器之间的依赖关系,提高扩展性,在没有引入消息中间件的情况可能出现如下:出现服务器多依赖的情况,不方面扩展,而引入消息中间件后如从图中可以看出引入消息中间件后,每个服务器只依赖于消息中间件,而且在应用中这种依赖关系式一种弱依赖关系ActiveMQ特性列表1.多种语言和协议编写客户端。语言:Java,C,C++,C#,Ruby,Perl,Python,PHP2.完全支持JMS1.1和J2EE1.4规范(持久化,XA消息,事务)3.对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性4.支持通过JDBC和journal提供高速的消息持久化5.从设计上保证了高性能的集群,客户端-服务器,点对点1.为什么异步调用是高效的?Systemsthatrelyuponsynchronousrequeststypicallyhavealimitedabilitytoscalebecauseeventuallyrequestswillbegintobackup,therebyslowingthewholesystem.《ActiveMQinAction》一书在解释同步调用的系统为什么会存在性能问题,或者反过来说为什么异步调用的系统性能要好的时候是这样解释的:同步调用总会有可能出现请求因为没有及时响应而导致阻塞的情况发生!2.JMS的消息格式和所有其他的通信规范一样,JMS也会定义消息的格式,如同http的request和response格式一样,jms的消息也分成header和body两部分:header部分主要是由预定义属性和一些自定义属性组成,一些重要的预定义属性有:JMSDestination:消息的目的地JMSDeliveryMode:消息的投递模式,有两种Persistent和NonpersistentJMSExpiration:消息的期限JMSMessageID:消息的IDJMSPriority:消息的优先级....body部分,JMS定义了六种java类型,它们是:1Message—Thebasemessagetype.Usedtosendamessagewithnopayload,onlyheadersandproperties.Typicallyusedforsimpleeventnotification.2TextMessage—AmessagewhosepayloadisaString.CommonlyusedtosendsimpletextualandXMLdata.3MapMessage—Usesasetofname/valuepairsasitspayload.ThenamesareoftypeStringandthevaluesareaJavaprimitivetype.4BytesMessage—Usedtocontainanarrayofuninterpretedbytesasthepayload.5StreamMessage—AmessagewithapayloadcontainingastreamofprimitiveJavatypesthat’sfilledandreadsequentially.6ObjectMessage—UsedtoholdaserializableJavaobjectasitspayload.UsuallyusedforcomplexJavaobjects.AlsosupportsJavacollections.3.消息的发布机制所有MOM现在都支持两种消息发布机制:point-to-point和publish-subscribe。点对点通信机制如下图:订阅发布通信机制如下图:补充:关于Request/Response风格的消息通信.AlthoughtheJMSspecdoesn’tdefinerequest/replymessagingasaformalmessagingdomain,itdoesprovidesomemessageheadersandacoupleofconvenienceclassesforhandlingbasicrequest/replymessaging.JMS没有定义这种风格的通信机制,但是通过一些消息header的属性和工具类是很容易实现这种通信模型的。这里所需要的header主要是JMSReplyTo和JMSCorrelationID两个属性.TheJMSReplyTospecifiesthedestinationwhereareplyshouldbesent,andtheJMSCorrelationIDinthereplymessagespecifiestheJMSMessageIDoftherequestmessage.Theseheadersareusedtolinkthereplymessage(s)totheoriginalrequestmessage.JMSReplyTo指明了响应应该送交的地址,很显然这是请求消息要提供的。JMSCorrelationID则用来指明这则消息是回复给那个请求的,因此它应该是响应消息里要提供的。Theconvenienceclassesforhandlingbasicrequest/replyaretheQueueRequestorandtheTopicRequestor.Theseclassesprovidearequest()methodthatsendsarequestmessageandwaitsforareplymessagethroughthecreationofatemporarydestinationwhereonlyonereplyperrequestisexpected.而工具类,则是指QueueRequestor和TopicRequestor的request方法,这个方法会发送一个请求消息,然后等待一个响应消息。二.安装与启动ActiveMQ安装1.在下载5.4.0发行包,解压到需要安装ActiveMQ的文件夹,记为/path/to/activemq。2.unix环境activemq文件夹需要执行权限,执行如下命令chmod-R755/path/to/activemq启动1.window环境运行/path/to/activemq/bin/activemq.bat2.unix环境运行/path/to/activemq/bin/activemq测试ActiveMQ默认使用的TCP连接端口是61616,通过查看该端口的信息可以测试ActiveMQ是否成功启动1.window环境运行netstat-an|find616162.unix环境运行netstat-an|grep61616监控ActiveMQ5.0版本默认启动时,启动了内置的jetty服务器,提供一个demo应用和用于监控ActiveMQ的admin应用。admin::三.如何使用ActiveMQ项目中需要把activemq-all-5.3.0.jar加入classpathActiveMQ的编码模板:发送端:publicclassQueueSender{publicstaticvoidmain(String[]args)throwsJMSException{//通过username,password,url创建连接工厂接口ConnectionFactoryfactory=newActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,tcp://localhost:61616);//通过连接工厂创建一个新的连接接口Connectionconnection=factory.createConnection();//通过连接接口创建一个会话接口Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);//会话接口创建有关主题的目标接口Destinationdestination=session.createQueue(test_queue);//会话接口再根据目标接口来创建一个消息生产者接口MessageProducerproducer=session.createProducer(destination);//调用会话生成一个文本消息Messagemessage=session.createTextMessage(HelloWorld!);//通过生产者接口Send将消息发布到ActiveMQ服务器producer.send(message);//关闭会话session.close();//关闭连接connection.close();}}消费端:publicclassQueueReceiver{publicstaticvoidmain(String[]args)throwsJMSException{//通过username,password,url创建连接工厂接口ConnectionFactoryfactory=newActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,tcp://localhost:61616);//通过连接工厂创建一个新的连接接口Connectionconnection=factory.createConnection();connection.start();//通过连接接口创建一个会话接口Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);//会话接口创建有关主题的目标接口Destinationdestination=session.createQueue(test_queue);//会话接口再根据目标接口来创建一个消息消费者接口MessageConsumerconsumer=session.createConsumer(destination);//消息消费者接收消息TextMessagemessage=(TextMessage)consumer.receive();if(null!=message){System.out.println(收到消息:+message.getText());}//关闭会话session.close();//关闭连接connection.close();}}消息发送端的简单实现过程首先根据传入的URI创建一个发布接口,创建过程如下:然后调用发布接口发布消息,发布过程如下:消息接收端的简单实现过程订阅者的创建过程和发布者的创建过程基本一样,不过最后创建的不是生产者接口,而是消息消费者接口(MessageConsumer),创建流程如下:JMS简介JMS1.1规范定义了一些概念和一组API,可以使得在我们利用消息系统的过程中,不依赖于各个厂商的具体实现,便能写出消息代码。由于不依赖具体厂商实现,这样的代码有很好的移植性。JMS1.1定义了的部分概念:1、JMS客户端:接收或发送消息的java系统2、JMS消息体:系统间发送的消息体3、JMS提供商:JMS规范实现厂商4、JMS管理对象:预先配置好的用于JMS客户端的JMS对象。如Connection
本文标题:ActiveMQ学习笔记
链接地址:https://www.777doc.com/doc-2896004 .html