zoukankan      html  css  js  c++  java
  • 分布式-信息方式-JMS大纲

     一、简介

    JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

    JMS允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。

    二、常用术语介绍

      在提到JMS时,我们通常会说到一些术语,解释如下:

    1. 消息中间件(JMS Provider) : 指提供了对JMS协议的第三方组件,比如ActiveMQ就是一个消息中间件,另外比较知名的还有KFA, Rabbit MQ等。
    2. 消息模式:分为点对点(Point to Point,即P2P)和发布/订阅(Pub/Sub),对应的数据结构分别是队列(Queue)和主题(Topic)
    3. 消息(Message): 通信内容的载体,其结构主要分为消息头,属性和消息体,并且根据存储结构的不同分为好几种,后面会详细提到。
    4. 消息生产者:产生消息的一方,在P2P模式下,指消息发送者(Sender),在P/S模式下指消息发布者(Publisher)
    5. 消息消费者:接收消息的一方,对应于两种模式分别是消息接收者(Receiver)和消息订阅者(Subscriber)                          

    三、JMS基本概念及原理详解

    1、基本概念
      JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。

    2、体系架构

      JMS由以下元素组成。

      1.JMS提供者 
      连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。

      2.JMS客户 
      生产或消费消息的基于Java的应用程序或对象。

      3.JMS生产者 
      创建并发送消息的JMS客户。

      4.JMS消费者 
      接收消息的JMS客户。

      5.JMS消息 
      包括可以在JMS客户之间传递的数据的对象

      6.JMS队列 
      一个容纳那些被发送的等待阅读的消息的区域。队列暗示,这些消息将按照顺序发送。一旦一个消息被阅读,该消息将被从队列中移走。

      7.JMS主题 
      一种支持发送消息给多个订阅者的机制。


    3、JMS消息模型(即点对点和发布订阅模型)

        1、Point-to-Point(P2P)

        2、Publish/Subscribe(Pub/Sub)


    4、P2P
      1、P2P模式图效果
          
      2、涉及到的概念

        2.1、消息队列(Queue)
        2.2、提供者(Sender)
        2.3、消费者(Receiver)
        2.4、每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。

      3、P2P的特点    

        3.1、每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
        3.2、提供者和消费者之间在时间上没有依赖性,也就是说当提供者发送了消息之后,不管消费者有没有正在运行,它不会影响到消息被发送到队列
        3.3、每条消息仅会传送给一个消费者。可能会有多个消费者在一个队列中侦听,但是每个队列中的消息只能被队列中的一个消费者所消费。
        3.4、消息存在先后顺序。一个队列会按照消息服务器将消息放入队列中的顺序,把它们传送给消费者。当已被消费时,就会从队列头部将它们删除(除非使用了消息优先级)。
        3.5、消费者在成功接收消息之后需向队列应答成功
        PS:如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。


    5、Pub/Sub(发布/订阅模式)
      
      1、Pub/Sub模式效果图
      2、涉及到的概念

        2.1、主题(Topic)
        2.2、发布者(Publisher)
        2.3、订阅者(Subscriber)

        PS:客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
      
      3、Pub/Sub(发布/订阅模式)的特点

        3.1、每个消息可以有多个消费者
        3.2、发布者和订阅者之间有时间上的依赖性。针对某个主题的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
        3.3、为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
        3.4、每条消息都会传送给称为订阅者的多个消息消费者。订阅者有许多类型,包括持久型、非持久型和动态型。
        3.5、发布者通常不会知道、也意识不到哪一个订阅者正在接收主题消息。
        3.6、消息被推送给消费者,这意味着消息会传送给消费者,而无须请求。

        PS:如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型


    6、关于消息的消费
      在JMS中,消息的产生和消息是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息。
      

      6.1、同步

        订阅者或消费者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞

      6.2、异步

        订阅者或消费者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。

    7、JMS应用程序接口

      7.1、ConnectionFactory 接口(连接工厂)
        创建Connection对象的工厂,根据消息类型的不同,用户将使用队列连接工厂,或者主题连接工厂分,
        别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。
      
      7.2、Destination 接口(目标)
        Destination是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者是队列,或者是主题。
        是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);
        对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。
        所以,Destination实际上就是两种类型的对象:Queue、Topic可以通过JNDI来查找Destination。

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

      7.4、Session 接口(会话)
        Session是我们操作消息的接口。表示一个单线程的上下文,用于发送和接收消息。
        由于会话是单线程的,所以消息是连续的,就是说消息是按照发送的顺序一个一个接收的。
        可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。
        同样,也分QueueSession和TopicSession。

      7.5、MessageProducer 接口(消息的生产者)
        消息生产者由Session创建,并用于将消息发送到Destination。消费者可以同步地(阻塞模式),或异步(非阻塞)接收队列和主题类型的消息。
        同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。

      7.6、MessageConsumer 接口(消息消费者)
        消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。
        可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。
        当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。

      7.7、Message 接口(消息)
        是在消费者和生产者之间传送的对象,也就是说从一个应用程序创送到另一个应用程序。一个消息有三个主要部分:
        1、消息头(必须):包含用于识别和为消息寻找路由的操作设置。
        2、一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。
        3、一个消息体(可选):允许用户创建五种类型的消息(文本消息,映射消息,字节消息,流消息和对象消息)。消息接口非常灵活,并提供了许多方式来定制消息的内容。

        消息接口非常灵活,并提供了许多方式来定制消息的内容。

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

    四、JMS提供者实现

      要使用Java消息服务,你必须要有一个JMS提供者,管理会话和队列。现在既有开源的提供者也有专有的提供者。
      开源的提供者包括:Apache ActiveMQ、Kafka、WebMethods、阿里的RocketMQ等

  • 相关阅读:
    POJ 1953 World Cup Noise
    POJ 1995 Raising Modulo Numbers (快速幂取余)
    poj 1256 Anagram
    POJ 1218 THE DRUNK JAILER
    POJ 1316 Self Numbers
    POJ 1663 Number Steps
    POJ 1664 放苹果
    如何查看DIV被设置什么CSS样式
    独行DIV自适应宽度布局CSS实例与扩大应用范围
    python 从入门到精通教程一:[1]Hello,world!
  • 原文地址:https://www.cnblogs.com/caoyingjielxq/p/9327429.html
Copyright © 2011-2022 走看看