ActiveMQ基础教程JMS概述

什么是JMS

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。可以简单的理解为:两个应用程序之间需要进行通信,我们使用一个JMS服务,进行中间的转发,通过JMS 的使用,我们可以解除两个程序之间的耦合。

JMS的优势

  • 异步:发送消息者可以在发送消息后进行其它的工作,不用等待接收者的回应,而接收者客户端获取消息的时候,不需要主动发送请求,消息会自动发送给可用的客户端;
  • 解耦:客户进程和服务对象进程不要求都正常运行,如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户不会接收到异常,消息中间件能保证消息不会丢失。
  • 可靠:JMS保证消息只会递送一次。可能你遇到过重复创建消息问题,而JMS能帮你避免该问题。

JMS的消息模型

点对点(Point-To-Point)

概述

点对点模型用于消息生产者和消息消费者之间点到点的通信。消息生产者将消息发送到由某个特定名字标示的消息队列(Queue)中,消息消费者从这个特定队列中获取对应消息。在消息传送给消费者之前它被存储在这个队列中。队列可以是持久的,以保证在消息服务出现故障时仍然能够传递消息。

在点对点消息传送模型中,应用程序由消息队列(Queue),发送者(Sender),接收者(Receiver)组成。每一个消息发送给一个特殊的消息队列,该队列保存了所有发送给它的消息(除了被接收者消费掉的和过期的消息)。

特点

  • 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)。
  • 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响消息被发送到消息队列中。
  • 当接收者收到消息的时候,会发送确认收到通知(acknowledgement)到消息队列。

模型图

点对点消息模型图.png

发布订阅(Publish/Subscribe)

概述

在发布/订阅消息模型中,发布者发布一个消息,该消息通过主题(Topic)传递给所有的客户端。在这种模型中,发布者和订阅者彼此不知道对方,是匿名的且可以动态发布和订阅主题(Topic)。主题(Topic)主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。

在发布与订阅消息传送模型中,应用程序由主题(Topic),发布者(Publisher),订阅者(Subscriber)组成。客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

特点

  • 每个消息可以有多个消费者即多个订阅者。
  • 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
  • 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

模型图

发布与订阅消息模型图.png

JMS的消息消费

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

  • 同步:订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞。
  • 异步:订阅者或接收者需要注册一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。

JMS的编程接口

API

JMS API是在javax.jms包中定义的。

JMS API.png

创建流程

要使用JMS API 需要创建一个提供连接对象的连接工厂。连接对象提供与消息服务器的链接。链接被用来创建会话,会话被用来创建消息,消息通过消息的生产者发送到目标(队列或主题),然后消息传递到消息消费者。

创建流程图.png

API详解

  • ConnectionFactory:创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。客户端使用一个连接工厂对象连接到JMS服务提供者,它创建了JMS服务提供者和客户端之间的连接。JMS客户端(如发送者或接受者)会在JNDI名字空间中搜索并获取该连接。使用该连接,客户端能够与目的地通讯,往队列或主题发送/接收消息。
  • Connection:Connection表示在客户端和JMS系统之间建立的链接。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。
  • Session:Session是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。同样,也分QueueSession和TopicSession。
  • Destination:消息目的地,即消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。Destination实际上就是两种类型的对象:Queue、Topic。
  • MessageProducer(消息生产者):消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。
  • MessageConsumer(消息消费者):消息消费者由Session创建,用于接收被发送到Destination的消息。同样有两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以通过session的creatDurableSubscriber方法来创建持久化的订阅者。
  • Message:是在消费者和生产者之间传送的对象,也就是说从一个应用程序创送到另一个应用程序。一个消息有三个主要部分:
    • 消息头(必须):包含用于识别和为消息寻找路由的操作设置。包含如下:

      • JMSDestination : 消息发送的目的地,主要是指Queue和Topic,由session创建而由生产者的send方法设置。
      • JMSDeliveryMode:传送模式,有持久模式和非持久模式两种。一条持久性的消息应该被传输“一次仅仅一次”,这就意味着如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递。一条非持久的消息最多会传递一次,这意味着服务器出现故障,该消息将永远丢失。由session创建由消息生产者的send方法设置。
      • JMSMessageID:唯一识别每个消息的标识,由JMS消息生产者产生。由send方法设置。
      • JMSTimestamp:一个JMS Provider在调用send()方法时自动设置,它是消息被发送和消费者实际接收的时间差。由客户端设置。
      • JMSCorrelationID:用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。在大多数情况下,JMSCorrelationID用于将一条消息标记为对JMSMessageID标示的上一条消息的应答,不过,JMSCorrelationID可以是任何值,不仅仅是JMSMessageID。由客户端设置。
      • JMSReplyTo:提供本消息回复消息的目的地址,由客户端设置。
      • JMSRedelivered:如果一个客户端收到一个设置了JMSRedelivered属性的消息,则表示可能客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged)。如果该消息被重新传送,JMSRedelivered=true 否则 JMSRedelivered=flase 。由JMS Provider设置。
      • JMSType:消息类型的标识符,由客户端设置。
      • JMSExpiration:消息过期时间,等于Destination的send方法中的timeToLive值加上发送时刻的GMT的时间值。如果timeToLive值等于零,则JMSExpiration被设置为零,表示该消息永不过期。如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。由send方法设置。
      • JMSPriority:消息优先级,从0-9十个级别,0-4是普通消息,5-9是加急消息。JMS不要求JMS Provider严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达,默认是4级。由send方法设置

        一个消息的消息头有这些属性,我们可以按照需要对这个消息的消息进行设计,在将这个消息使用消息生产者的send()方法发送到消息服务上。

    • 一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。
    • 一个消息体(可选):允许用户创建五种类型的消息:TextMessage(文本消息)、MapMessage(映射消息),BytesMessage(字节消息)、StreamMessage(流消息)和(ObjectMessage)对象消息。消息接口非常灵活,并提供了许多方式来定制消息的内容。
  • MessageListener:消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。


整理文章主要为了自己日后复习用,文章中可能会引用到别的博主的文章,如涉及到博主的版权问题,请博主联系我。

原文地址:https://www.jianshu.com/p/639627f88a6e

原文地址:https://www.cnblogs.com/jpfss/p/10445155.html

时间: 2024-11-11 12:02:58

ActiveMQ基础教程JMS概述的相关文章

ActiveMQ基础教程----简单介绍与基础使用

概述 ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能. 特性 遵循JMS规范:ActiveMQ的各种特性是JMS1.1规范的实现.它们包括同步和异步消息传递,一次和只有一次的消息传递,对于预订者的持久消息等等.依附于JMS规范意味着,不论JMS消息提供者是谁,同样的基本特

计算机基础教程1 - 概述

计算机是一种先进的电子设备,它将原始数据做为用户的输入并在一组指令(称为程序)的控制下 处理它,产生结果(输出), 并保存以供将来使用. 本教程介绍了计算机硬件,软件,操作系统,外围设备 等的基本概念,以及如何从计算机技术中获得最大价值和影响. 受众: 本教程是为初学者以及想要处理计算机的高级学习者准备的. 该教程对于计算机科学,工程,工商 管理,管理,科学,商业和艺术的本科学生也非常有用,其中计算机入门课程是课程的一部分. 完成本教程后,您将发现自己具备中等水平的计算机基础专业知识,从这里您可

Java基础教程(1)--概述

一.什么是Java语言 ??Java是于1996年由Sun公司发布的一种极富创造力的面向对象的程序设计语言.它不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程. 二.Java的特点 ??Java的设计者编写了颇具影响力的白皮书,用来解释设计的初衷和Java的特性.这一小节将会对这些术语进行解释. 简单性 ??J

OpenLayers3基础教程——OL3只之Popup

概述: 本节重点讲述OpenLayers3中Popup的调用时实现,OL3改用Overlay代替OL2的Popup功能. 接口简介: overlay跟ol.control.Control一样,是一个可见的窗口,但是不和Control一样,不是固定在地图区域的某个部分,而是显示在一个地图坐标上,随着地图的移动或者缩放而移动的.其调用方式如下: var popup = new ol.Overlay({ element: document.getElementById('popup') }); pop

《语义网基础教程》学习笔记(二)

二.RDF概述(参考http://zh.transwiki.org/cn/rdfprimer.htm) 1.本体: 一个本体是一个概念体系(conceptualization)的显式的形式化规范. 一般来说,一个本体形式地刻画一个论域.一个典型的本体由有限个术语及它们之间的关系组成. ★在万维网这个环境中,本体提供了对给定领域的一种共识.这种共识对于消除术语差别是必要的. 通过把各自的术语差异映射到一个公共的本体之间的直接映射,可以消除这些术语差异. 不管采用哪种方案,本体都支持语义可共用性(s

Linux makefile教程之概述一[转]

概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些 Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂.这就好像现在有这么多 的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile 了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力. 因为,makefile关系到了整个工

OpenLayers3基础教程——OL3 介绍interaction

概述: 本节主要讲述OL3的交互操作interaction,重点介绍draw,select以及modify. 接口说明: OL3的interaction继承自ol.interaction.defaults,下面实现了以下几中交互操作: 创建方式为: var interaction = new ol.interaction.InteractionType({options});添加和移除方式为:map.addInteraction(draw);map.removeInteraction(draw)

《语义网基础教程》学习笔记(一)

一.XML概述 1.有效(valid)的XML文档:遵守了XML文档的基本规则,并使用DTD或Schema定义了语义约束,而且也完全遵守了DTD或Schema所定义的语义约束的XML文档 2.XML声明部分的encoding属性值应该与保存该文档所使用的字符集相同.如果需要让XML支持中文,应该注意以下几点: ①保存文件时使用支持中文的字符集 ②XML声明部分的encoding属性应该与保存该文件时所使用的字符集相同 3.XML元素里的多个属性之间是无序的,因此同一个元素不可包含多个同名的属性,

Berkeley DB基础教程

一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2)key/value是Berkeley DB用来管理数据的基础,每个key/value对代表一条记录. (3)Berkeley DB在底层实现采用B树,可以看成能够存储大量数据的HashMap. (4)它是Oracle公司的一个产品,C++版本最新出现,之后JAVA等版本也陆续出现.它不支持SQL语