您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > JMS详解-ActiveMQ
基本概念JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。消息模型○Point-to-Point(P2P)○Publish/Subscribe(Pub/Sub)即点对点和发布订阅模型P2PP2P模式图涉及到的概念消息队列(Queue)发送者(Sender)接收者(Receiver)每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。P2P的特点每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列接收者在成功接收消息之后需向队列应答成功如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。Pub/SubPub/Sub模式图涉及到的概念主题(Topic)发布者(Publisher)订阅者(Subscriber)客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。Pub/Sub的特点每个消息可以有多个消费者发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型消息的消费在JMS中,消息的产生和消息是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息。○同步订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞○异步订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。JMS编程模型(1)ConnectionFactory创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。(2)DestinationDestination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。所以,Destination实际上就是两种类型的对象:Queue、Topic可以通过JNDI来查找Destination。(3)ConnectionConnection表示在客户端和JMS系统之间建立的链接(对TCP/IPsocket的包装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。(4)SessionSession是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。同样,也分QueueSession和TopicSession。(5)消息的生产者消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。(6)消息消费者消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。(7)MessageListener消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。EJB中的MDB(Message-DrivenBean)就是一种MessageListener。企业消息系统的好处我们先来看看下图,应用程序A将Message发送到服务器上,然后应用程序B从服务器中接收A发来的消息,通过这个图我们一起来分析一下JMS的好处:提供消息灵活性松散耦合异步性现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的。我们介绍了消息通信的规范JMS,我们这篇博文介绍一款开源的JMS具体实现——ActiveMQ。ActiveMQ是一个易于使用的消息中间件。消息中间件我们简单的介绍一下消息中间件,对它有一个基本认识就好,消息中间件(MOM:MessageOrientmiddleware)。消息中间件有很多的用途和优点:1.将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外一个模块;2.负责建立网络通信的通道,进行数据的可靠传送。3.保证数据不重发,不丢失4.能够实现跨平台操作,能够为不同操作系统上的软件集成技工数据传送服务MQ首先简单的介绍一下MQ,MQ英文名MessageQueue,中文名也就是大家用的消息队列,干嘛用的呢,说白了就是一个消息的接受和转发的容器,可用于消息推送。下面进入我们今天的主题,为大家介绍ActiveMQ:ActiveMQ简要概述ActiveMQApacheActiveMQ™isthemostpopularandpowerfulopensourcemessagingandIntegrationPatternsserver.ApacheActiveMQisfast,supportsmanyCrossLanguageClientsandProtocols,comeswitheasytouseEnterpriseIntegrationPatternsandmanyadvancedfeatureswhilefullysupportingJMS1.1andJ2EE1.4.ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMSProvider实现,它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。下面我们下载一个版本,玩一玩。下载ActiveMQ官方网站:现在ActiveMQ最新的版本是5.11.1,下载挺简单的,就不再截图了。运行ActiveMQ服务下载,解压缩大家现在好之后,将apache-activemq-5.11.1-bin.zip解压缩,我们可以看到它的整体目录结构:从它的目录来说,还是很简单的:bin存放的是脚本文件conf存放的是基本配置文件data存放的是日志文件docs存放的是说明文档examples存放的是简单的实例lib存放的是activemq所需jar包webapps用于存放项目的目录启动ActiveMQ我们了解activemq的基本目录,下面我们运行一下activemq服务,双击bin目录下的activemq.bat脚本文件或运行自己电脑版本下的activemq.bat,就可以看下图的效果。从上图我们可以看到activemq的存放地址,以及浏览器要访问的地址.3.测试ActiveMQ默认使用的TCP连接端口是61616,通过查看该端口的信息可以测试ActiveMQ是否成功启动netstat-an|find“61616”C:\DocumentsandSettings\Administratornetstat-an|find61616TCP0.0.0.0:616160.0.0.0:0LISTENING4.监控ActiveMQ默认启动时,启动了内置的jetty服务器,提供一个用于监控ActiveMQ的admin应用。admin:用户名和密码都是adminJMS其实并没有想象的那么高大上,看完这篇博文之后,你就知道什么叫简单,下面直接进入主题。开发环境我们使用的是ActiveMQ5.11.1Release的Windows版,官网最新版是ActiveMQ5.12.0Release,大家可以自行下载,下载地址。需要注意的是,开发时候,要将apache-activemq-5.11.1-bin.zip解压缩后里面的activemq-all-5.11.1.jar包加入到classpath下面,这个包包含了所有jms接口api的实现。搭建开发环境建立项目我们只需要建立一个java项目就可以了,导入jar包,项目截图:点对点的消息模型,只需要一个消息生成者和消息消费者,下面我们编写代码。编写生产者packagecom.tgb.activemq;importjavax.jms.Connection;importjavax.jms.ConnectionFactory;importjavax.jms.Destination;importjavax.jms.JMSException;importjavax.jms.MessageProducer;importjavax.jms.Session;importjavax.jms.TextMessage;importorg.apache.activemq.ActiveMQConnection;importorg.apache.activemq.ActiveMQConnectionFactory;/***消息的生产者(发送者)*@authorliang**/publicclassJMSProducer{//默认连接用户名privatestaticfinalStringUSERNAME=ActiveMQConnection.DEFAULT_USER;//默认连接密码privatestaticfinalStringPASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;//默认连接地址privatestaticfinalStringBROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL;//发送的消息数量privatestaticfinalintSENDNUM=10;publicstaticvoidmain(String[]args){//连接工厂ConnectionFactoryconnectionFactory;//连接Connectionconnection=null;//会话接受或者发送消息的线程Sessionsession;//消息的目的地Destinationdestination;//消息生产者MessageProducermessageProducer;//实例化连接工厂connectionFactory=newActiveMQConnectionFactory(JMSProducer.USERNAME,JMSProducer.PASSWORD,JMSProducer.BROKEURL);try{//通过连接工厂获取连接connection=connectionFactory.createConnection();//启动连接connection.start();//创建sessionsession=con
本文标题:JMS详解-ActiveMQ
链接地址:https://www.777doc.com/doc-2882031 .html