zoukankan      html  css  js  c++  java
  • Java JMS

    什么是JMS

    摘要:The Java Message Service (JMS) API is a messaging standard that allows application components based on the java Platform Enterprise Edition (Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.
    JMS(Java Message Service,java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。

    总而言之:JMS是JavaEE平台上消息服务的标准API,其他消息队列产品都应当遵守此API。

    activeMq、RabbitMq等与JMS的区别

    ActiveMq、RabbitMq是基于JMS标准产生的具体消息队列产品,消息生产者和消费者 可以通过上述消息队列产品进行消息的异步传输。

    消息模型

    消息队列的好处

    提供消息灵活性:
    应用程序A与应用程序B通过使用消息队列服务进行消息通信。通信的消息会存在消息队列服务里,由消息队列服务处理网络通信。如果网络连接不可用,消息队列服务将会存储消息,直到连接可用时,再将消息转发给应用程序B。

    灵活性的另一个方面体现在,当应用程序发送其消息时,应用程序B设置可以不处于执行状态。消息队列服务将保留这个消息,直到应用程序B开始执行并试着检索消息为止。这还防止了应用程序A因为等待应用程序B检索消息而出现的阻塞。

    这种异步通信要求应用程序的设计与现在大多数应用程序不同,不过对于对实时性要求不高的业务场景,是一个比较好的架构策略。

    松散耦合:
    消息队列服务的真正威力在于应用程序的松散耦合。消息发送方和消息消费者都可以任意被替换。双方之间没有强耦合。

    点对点模式(point to point , p2p)

    点对点模式下:生产者发送消息到一个特定的队列中,而消费者从这个消息队列中获取消息,处理后进行应答。

    点对点模式的特点:

    1. 每个消息只有一个消费者(即一旦被消费,消息就不在消息队列中)。注意:虽然点对点模式下,一条消息只能被一个消费者消费,但是消费者是可以有多个的,最简单的情况就是:消费者部署了多台机器。
    2. 消费者需要对消息进行应答:消息接收者在成功接收消息之后需要向消息队列进行应答,确认消息已经被自己接收到;否则消息服务会认为该消息没有被接收,那么这条消息仍然可能被其他人接收。
    3. 消息的生产和消费在时间顺序上没有先后要求:生产者在发送消息后,消费者可以在任意的时刻进行接收,只要消息没有过期或被其他的用户接收。而在基于订阅发布的广播模式下,消息队列服务在接收到生产者生产的消息后会进行广播,如果此时订阅者没有订阅或者订阅失败,此条消息该订阅者将永远不会收到。

    订阅发布模式(Pub/Sub)

    模式图:

    涉及到的概念

    1. 主题
    2. 发布者(Publisher)
    3. 订阅者(Subscriber)客户端将消息发送到主题,多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

    发布订阅模式的特点:

    1. 每个消息都可以有多个订阅者。每条消息可以有多个消费者,如报纸和杂志一样,谁订阅了谁都可以获得。
    2. 订阅者只能消费它们订阅之后出版的消息。这就要求订阅者必须先订阅,生产者再发布。即订阅者必须先运行,再等待生产者的运行,这和点对点类型有差异。但是为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
    3. 订阅者可能会错过订阅的消息。订阅者必须保持为运行状态才能消费消息,严格来说,这可归属于上面的第2点。

    JMS编程模型

    1. ConnectionFactory
      创建Connection对象工厂,针对于两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。

    2. Destination
      Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。
      所以,Destination实际上就是两种类型的对象:Queue、Topic可以通过JNDI来查找Destination。

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

    4. Session
      Session是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。同样,也分QueueSession和ToicSession。

    5. MessageProducer(消息的生产者)
      消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分为两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send和publish方法)发送消息。

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

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

    JavaEE6 文档说明

    参考原文

    1. 深入浅出JMS(一)——JMS简介
    2. 深入浅出JMS(一)--JMS基本概念
  • 相关阅读:
    剑指 Offer 41. 数据流中的中位数
    剑指 Offer 19. 正则表达式匹配
    leetcode 75 颜色分类
    Deepin 添加 open as root
    window 下 无损进行其他文件系统(ext4) 到 ntfs 文件系统的转化
    Windows Teminal Preview Settings
    CentOS 7 容器内替换 apt-get 源为阿里源
    Ubuntu 20.04 安装 Consul
    elementary os 15 添加Open folder as root
    elementary os 15 gitbook install
  • 原文地址:https://www.cnblogs.com/boothsun/p/7477176.html
Copyright © 2011-2022 走看看