【Java消息队列】——JMS概述

概述

1.1 什么是JMS

  • JMS
    JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
  • JMS的优势
    异步:JMS天生就是异步的,客户端获取消息的时候,不需要主动发送请求,消息会自动发送给可用的客户端。
    可靠:JMS保证消息只会递送一次。大家都遇到过重复创建消息问题,而JMS能帮你避免该问题,只是避免而不是杜绝,所以在一些糟糕的环境下还是有可能会出现重复。
  • 它类似于JDBC(Java DatabaseConnectivity):这里,JDBC 是可以用来访问许多不同关系数据库的API,而JMS同样提供与厂商无关的访问方式来访问消息收发服务

1.2 什么是MQ

  • MQ 消息队列

    消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。
    消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。
    排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求

  • 特点

    MQ的消费-生产者模型的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。

  • 应用场景

    在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

1.3 什么是ActiveMQ

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

  • 优点:

    是一个快速的开源消息组件(框架),支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,XA,和J2EE1.4容器无缝结合,并且支持轻量级容器和大多数跨语言客户端上的Java虚拟机。消息异步接受,减少软件多系统集成的耦合度。消息可靠接收,确保消息在中间件可靠保存,多个消息也可以组成原子事务。

  • 缺点:

    ActiveMQ默认的配置性能偏低,需要优化配置,但是配置文件复杂,ActiveMQ本身不提供管理工具;示例代码少;主页上的文档看上去比较全面,但是缺乏一种有效的组织方式,文档只有片段,用户很难由浅入深进行了解,二、文档整体的专业性太强。在研究阶段可以通过查maillist、看Javadoc、分析源代码来了解。

1.4 JMS、MQ及ActiveMQ的关系

  • JMS和MQ的关系
    JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。

MQ的实现可以基于JMS,也可以基于其他规范或标准,其中ActiveMQ就是基于JMS规范实现的消息队列。

JMS

2.1 JMS对象模型

JMS应用程序由如下基本模块组成:

1、管理对象(Administered objects)-连接工厂(Connection Factories)和目的地(Destination)
2、连接对象(Connections)
3、会话(Sessions)
4、消息生产者(Message Producers)
5、消息消费者(Message Consumers)
6、消息监听者(Message Listeners)

在这里插入图片描述

  • JMS由以下元素组成

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

    JMS客户 —— 生产或消费基于消息的Java的应用程序或对象(生产者和消费者)

    JMS生产者 —— 创建并发送消息的JMS客户。(activemq 中体现为生成消息对象,并将对象存入消息队列中。)

    JMS消费者 —— 接收消息的JMS客户。(activemq 中体现为获取消息队列中的消息对象,进行相应的业务处理)

    JMS消息 —— 在JMS客户之间传递的数据的对象

    JMS队列 —— 一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。

2.2 JMS 的两种消息传递类型

在这里插入图片描述

  • 点对点模式(P2P)

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

    (1)、每个消息只有一个接受者(自己测试了一下,可以有多个接受者,但是当有多个接收者时,每个接收者只能获取随机的几条信息)

    (2)、消息发送者和消息接受者并没有时间依赖性。

    (3)、当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息;

    (4)、当接收者收到消息的时候,会发送确认收到通知(acknowledgement)。

  • 发布/订阅模式

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

在这里插入图片描述

2.3 JMS对象类型

连接工厂(ConnectionFactory):利用连接工厂创建一个JMS连接。

JMS连接(Connection):表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。

JMS会话(Session):表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。

JMS目的(Destination):又称为消息队列,是实际的消息源。

生产者(Message Producer)和消费者(Message Consumer):对象由Session对象创建,用于发送和接收消息。

2.4 JMS接收消息

消息的接收可以使用以下两种方式:同步方式 和 异步方式

  • 同步方式

    使用同步方式接收消息的话,消息订阅者调用receive()方法。在receive()中,消息未到达或在到达指定时间之前,方法会阻塞,直到消息可用。
    (1) 目的地是Queue

      consumer = session.createConsumer(queue);
      Message message = consumer.receive(); //同步方式接收
    

    (2)目的地是Destination

      consumer = session.createConsumer(destination);
      //同步方式接受信息,如果还没有获取到则会阻塞直到接收到信息
      Message messages = consumer.receive();
    
  • 异步方式

    使用异步方式接收消息的话,消息订阅者需注册一个消息监听者,类似于事件监听器,只要消息到达,JMS服务提供者会通过调用监听器的onMessage()递送消息。

    异步方式接收是使用了监听方式

consumer.setMessageListener(new MessageListener(){
					@Override
					public void onMessage(Message message) {
						TextMessage textMessage = (TextMessage)message;
						try {
							String value = textMessage.getText();
							System.out.println("value: "+value);
						} catch (JMSException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				});

2.5 Spring整合JMS

-

posted @ 2021-03-03 20:53  your_棒棒糖  阅读(961)  评论(0)    收藏  举报