美文网首页
java中间件之jms

java中间件之jms

作者: 这一刻_776b | 来源:发表于2019-12-24 16:16 被阅读0次

    一、JMS简介

    1.1 JMS是什么

    JMS Java Message Service Java消息服务。是JAVA EE中的一个技术,JMS定义了JAVA中访问消息中间件的接口。类似JDBC。定义了接口,并不具体实现。实现JMS接口消息的中间件称为JMS Provider.例如:ActiveMQ.

    Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持(百度百科给出的概述)。我们可以简单的理解:两个应用程序之间需要进行通信,我们使用一个JMS服务,进行中间的转发,通过JMS 的使用,我们可以解除两个程序之间的耦合。

    1.2 JMS的优势  

    Asynchronous(异步)

    JMS is asynchronous by default. So to receive a message, the client is not required to send the request. The message will arrive automatically to the client as they become available.(JMS 原本就是一个异步的消息服务,客户端获取消息的时候,不需要主动发送请求,消息会自动发送给可用的客户端)

    Reliable(可靠)

    JMS provides the facility of assurance that the message will delivered once and only once. You know that duplicate messages create problems. JMS helps you avoiding such problems.(JMS保证消息只会递送一次。大家都遇到过重复创建消息问题,而JMS能帮你避免该问题。)

    1.3 JMS的可靠性机制

    消息确认JMS消息只有被确认之后,才能认为被成功的消费了。一般消息被成功消费分三个步骤,客户接受消息,处理消息,确认消息。消息何时被确认取决于创建会话时的应答模式。应答模式有三种: 1.Session.AUTO_ACKNOWLEDGE:客户从receive方法成功返回,或者从MessageListener.onMessage方法成功返回时候,会话自动确认客户收到消息。 2.Session_CLIENT_ACKNOWLEDGE:客户通过调用acknowledge方法确认消息。这个确认是会话级别的确认。也就是说只要确认一个被消费消息,那么这个会话上的所有被消费的消息都会被确认。 3.Session_DUPS_ACKNOWLEDGE:会话迟钝的确认消息。选择这个模式有可能出现重复的消息。JMSRedelivered会是true.

    消息持久性JMS支持两种消息提交模式: 1.PERSISTENT:持久模式。 2.NON_PERSISTENT:非持久模式。这个两种模式上面有介绍。

    消息优先级消息优先级,等级从0-9.默认为4.数值越大,优先级越高。

    消息过期消息过期时间。默认为永久不过期。

    持久订阅持久订阅,首先消息的生产者必须使用持久模式提交信息,消费者可以通过createDurableSubscriber方法来创建一个持久订阅。持久订阅在某一个时刻只能有一个激活的订阅者。持久订阅创建之后会一直保存,直到应用程序在会话上调用unsubcribe方法。

    本地事物JMS session提供了commit与rollback方法来控制事物。事物提交意味着生产的所有消息被提交,消费的所有消息被确认。回滚意味着生产的所有消息被销毁,消费的所有消息被恢复并重新提交,除非它们过期。

    1.4 JMS的API结构

    (1)管理对象(Administered objects)-连接工厂(Connection Factories)和目的地(Destination)

    (2)连接对象(Connections)

    (3)会话(Sessions)

    (4)消息生产者(Message Producers)

    (5)消息消费者(Message Consumers)

    (6)消息监听者(Message Listeners)

    (1)、Connection Factories

    创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。客户端使用一个连接工厂对象连接到JMS服务提供者,它创建了JMS服务提供者和客户端之间的连接。JMS客户端(如发送者或接受者)会在JNDI名字空间中搜索并获取该连接。使用该连接,客户端能够与目的地通讯,往队列或话题发送/接收消息。

    QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) initialCtx.lookup ("primaryQCF");

    Queue purchaseQueue = (Queue) initialCtx.lookup ("Purchase_Queue");

    Queue returnQueue = (Queue) initialCtx.lookup ("Return_Queue");

    [if !supportLists](2)[endif]、Destination

    目的地指明消息被发送的目的地以及客户端接收消息的来源。JMS使用两种目的地,队列和话题。如下代码指定了一个队列和话题:

    创建一个队列Session:

    QueueSession ses = con.createQueueSession (false, Session.AUTO_ACKNOWLEDGE);  //get the Queue object  

    Queue t = (Queue) ctx.lookup ("myQueue");  //create QueueReceiver  

    QueueReceiver receiver = ses.createReceiver(t);

    (3)、Connection

    Connection表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。

    连接对象封装了与JMS提供者之间的虚拟连接,如果我们有一个ConnectionFactory对象,可以使用它来创建一个连接。

    Connection connection = connectionFactory.createConnection();

    (4)、Session

    Session是我们对消息进行操作的接口,可以通过session创建生产者、消费者、消息等。Session 提供了事务的功能,如果需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。

    我们可以在连接创建完成之后创建session:

    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    这里面提供了参数两个参数,第一个参数是是否支持事务,第二个是事务的类型

    (5)、Producter

    消息生产者由Session创建,用于往目的地发送消息。生产者实现MessageProducer接口,我们可以为目的地、队列或话题创建生产者;

    MessageProducer producer = session.createProducer(dest);

    MessageProducer producer = session.createProducer(queue);

    MessageProducer producer = session.createProducer(topic);

    (6)、Consumer

    消息消费者由Session创建,用于接收被发送到Destination的消息。

    MessageConsumer consumer = session.createConsumer(dest);

    MessageConsumer consumer = session.createConsumer(queue);

    MessageConsumer consumer = session.createConsumer(topic);

    (7)、MessageListener

    消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一种MessageListener。

    1.5 JMS应用的基本步骤

    (1)创建Connection Factory

    (2)通过factory创建Connection。

    (3)启动Connection

    (4)通过Connection创建JMS Session

    (5)session创建destination

    (6)session创建producer 并设置destination。

    (7)session创建consumer,设置目的地。或者注册一个JMS Message listener.

    (8)发送或者接受Message(s)

    (9)关闭所有JMS资源。

    二、JMS基本概念

    2.1 JMS Message

    JMS Message JMS消息,JMS消息由三部分组成 (1)消息头:每个消息头都有对应的setter、getter方法。 (2)消息属性:如果需要除消息头以外的值,可以使用消息属性。(3)消息体:封装具体的消息数据。

    2.2 JMS producer

    JMS Producer:消息生产者,创建和发送JMS Message的客户端应用。

    2.3 JMS consumer

    JMS Consumer:消息消费者,接收和处理JMS Message的客户端应用。消息的消费可以采取以下两种消费方式。 (1)同步消费:通过调用消费者的receive方法从目的地中显示的提取消息,receive方法会一直阻塞,知道消息到达。 

    (2)异步消费:通过为消费者注册一个消息监听器,定义消息到达时采取的动作。

    2.4 JMS domains

    JMS domains: 消息传递域。也可以理解为消息传递的方式。JMS规范中定义了两种消息传递的机制,点对点(point-to-point, 简写PTP)和发布/订阅(publish/subscribe,简写pub/sub). 1.PTP的特点如下: (1)每个消息只能有一个消费者。PTP目的地被称为队列(Queue)。 (2)消费者和生产者之间没有时间相关性。也就是说消息生产者不管消费者是否处于运行状态都可以发送消息,而消费者也可以不管生产者是否在线都可以接收消息。 

    2.pub/sub特点。 (1)每个消息可以有多个消费者。生产者把消息发布到一个“主题”上。 (2)生产者和消费者之间有时间相关性。也就是说,消费者只能消费它订阅的主题之后,主题发布的消息。而且如果没有进行持久订阅,那么消费者只能消费在线时生产者发布的消息。JMS规范允许进行持久订阅。一定程度上减少了时间的相关性。pub/sub目的地被称为主题(Topic) 

    2.5 Connection Factory

    connection factory:连接工厂,用来创建连接到JMS Provider连接对象。

    2.6 JMS Connection

    connection:连接对象。封装了客户与JMS Provider的一个虚拟连接。

    2.7 JMS Session

    session:生产和消费消息的一个单线程上下文。会话用于创建生产者、消费者、目的地、消息等,会话提供了一个事物性的上下文,在会话中,一组发送和接收消息被组合到一个操作中。

    2.8 Destination

    destination:消息发送和接收的目的地。

    2.9 JMS Client

    client:用来接收消息的应用。

    2.10 JMS消息结构

    JMS Message由消息头,消息属性,消息体三部分组成。

    2.11 JMS消息头

    消息头包含消息的识别信息和路由信息,消息头的一些标准属性如下:1.JMSDestination:消息发送目的地,由Send方法设置,主要指点对点中的Queue与pub/sub中的Topic,自动分配。 2.JMSDeliveryMode:传送模式,传送模式分为如下两种: (1)持久模式:一条持久性的消息应该被传送“一次仅仅一次”。一次就是这个消息一定会被传递一次。例如JMS提供者出现故障,那么在恢复之后这条消息不会丢失,会再次被传递,直到成功。仅仅一次,就只要传递成功就不会再次被传递。 (2)非持久模式:一条非持久的消息“最多被传送一次“。最多一次意味着这条消息有可能丢失。如服务器故障,恢复后次消息会被丢失。 3.JMSExpiration:由Send方法设置。消息过期时间。默认为永久不过期。 4.JMSPriority:消息优先级,等级从0-9.默认为4.数值越大,优先级越高。 5.JMSMessageID:唯一识别每个消息的标志。由JMS Provider产生,自动分配。 6.JMSTimestamp:JMS Provider调用Send方法时候自动设置,是消息被返送和消息被消费之间的实际时间差。 7.JMSCorrelationID:用来连接到另外一个消息。典型的应用就是在回复消息中连接到原消息。JMSCorrelationID可以由开发者设置称为任何值。 8.JMSReplyTo: 提供本消息回复消息的目的地地址。由开发者设置。 9.JMSType: 消息类型识别符,由开发者设置。 10.JMSRedelivered:这个有两个值,true或者false。如果为true说明这条消息被客户端收到过,但是因为某种原因没有被签收。

    2.12 JMS消息属性

    消息属性包含三种类型:(1)应用程序添加的属性。如:message.setStringProperty(“userName”,”张三”); (2)JMS定义的属性。使用”JMSX”作为属性的前缀名。 (3)JMS供应商定义的属性。

    2.13 JMS消息体

    - JMS API定义了5中形式的消息体,也可以理解为5中消息类型。TextMessage、MapMessage、BytesMessage、StreamMessage、ObjectMessage.

    三、JMS的消息模型

    3.1 JMS具有两种通信模式

    1、Point-to-Point Messaging Domain (点对点)

    2、Publish/Subscribe Messaging Domain (发布/订阅模式)

       在JMS API出现之前,大部分产品使用“点对点”和“发布/订阅”中的任一方式来进行消息通讯。JMS定义了这两种消息发送模型的规范,它们相互独立。任何JMS的提供者可以实现其中的一种或两种模型,这是它们自己的选择。JMS规范提供了通用接口保证我们基于JMS API编写的程序适用于任何一种模型。

    3.2 JMS模式

    JMS为发开者提供了很多的要素,看一下比较重要的几个:

    3.3 JMS点对点通信模型

    Point-to-Point Messaging Domain(点对点通信模型)

    涉及到的概念:在点对点通信模式中,应用程序由消息队列,发送方,接收方组成。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。

    特点:

    (1)每个消息只要一个消费者

    (2)发送者和接收者在时间上是没有时间的约束,也就是说发送者在发送完消息之后,不管接收者有没有接受消息,都不会影响发送方发送消息到消息队列中。

    (3)发送方不管是否在发送消息,接收方都可以从消息队列中去到消息(The receiver can fetch message whether it is running or not when the sender sends the message)

    (4)接收方在接收完消息之后,需要向消息队列应答成功

    3.4 JMS发布/订阅通信模型

    Publish/Subscribe Messaging Domain(发布/订阅通信模型)

    涉及到的概念:在发布/订阅消息模型中,发布者发布一个消息,该消息通过topic传递给所有的客户端。该模式下,发布者与订阅者都是匿名的,即发布者与订阅者都不知道对方是谁。并且可以动态的发布与订阅Topic。Topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。

    特点:

    (1)一个消息可以传递个多个订阅者(即:一个消息可以有多个接受方)

    (2)发布者与订阅者具有时间约束,针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。

    (3)为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

    相关文章

      网友评论

          本文标题:java中间件之jms

          本文链接:https://www.haomeiwen.com/subject/trdfoctx.html