广告
返回顶部
首页 > 资讯 > 精选 >JMS是什么意思
  • 755
分享到

JMS是什么意思

2023-06-27 12:06:04 755人浏览 泡泡鱼
摘要

小编给大家分享一下JMS是什么意思,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的api,用

小编给大家分享一下JMS是什么意思,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

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

JMS是什么意思

当前环境

  1. Mac OS 10.11.x
  2. Docker 1.12.1
  3. jdk 1.8
  4. SpringBoot 1.5

前言

基于之前一篇“一个故事告诉你什么是消息队列”,了解了消息队列的使用场景以及相关的特性。本文主要讲述消息服务在 JAVA 中的使用。

市面上的有关消息队列的技术选型非常多,如果我们的代码框架要支持不同的消息实现,在保证框架具有较高扩展性的前提下,我们势必要进行一定的封装。

在 JAVA 中,大可不必如此。因为 JAVA 已经制定了一套标准的 JMS 规范。该规范定义了一套通用的接口和相关语义,提供了诸如持久、验证和事务的消息服务,其最主要的目的是允许Java应用程序访问现有的消息中间件。就和 JDBC 一样。

基本概念

在介绍具体的使用之前,先简单介绍一下 JMS 的一些基本知识。这里我打算分为 3 部分来介绍,即 消息队列(MQ)的连接、消息发送与消息接收。

这里我们的技术选型是 springBoot、JMS、ActiveMQ

为了更好的理解 JMS,这里没有使用 SpringBoot 零配置来搭建项目

MQ 的连接

使用 MQ 的第一步一定是先连接 MQ。因为这里使用的是 JMS 规范,对于任何遵守 JMS 规范的 MQ 来说,都会实现相应的ConnectionFactory接口,因此我们只需要创建一个ConnectionFactory工厂类,由它来实现 MQ 的连接,以及封装一系列特性的 MQ 参数。

例子:这里我们以 ActiveMQ 为例,

Maven 依赖:

org.springframework.bootspring-boot-starter-parent1.5.3.RELEASE org.springframework.boot spring-boot-starter-activemq

创建 ActiveMQ 连接工厂:

@Beanpublic ConnectionFactory connectionFactory(){   ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();   connectionFactory.setBrokerURL(ActiveMQ_URL);   connectionFactory.setUserName(ActiveMQ_USER);   connectionFactory.setPassword(ActiveMQ_PASSWord);   return connectionFactory;}

消息发送

关于消息的发送,是通过 JMS 核心包中的JmsTemplate类来实现的,它简化了 JMS 的使用,因为在发送或同步接收消息时它帮我们处理了资源的创建和释放。从它的作用也不难推测出,它需要引用我们上面创建的连接工厂,具体代码如下:

@Beanpublic JmsTemplate jmsQueueTemplate(){   return new JmsTemplate(connectionFactory());}

JmsTemplate创建完成后,我们就可以调用它的方法来发送消息了。这里有两个概念需要注意:

  1. 消息会发送到哪里?-> 即需要指定发送队列的目的地(Destination),是可以在 JNDI 中进行存储和提取的 JMS 管理对象。
  2. 发送的消息体具体是什么?-> 实现了javax.jms.Message的对象,类似于 JAVA RMI 的 Remote 对象。

代码示例:

@Autowiredprivate JmsTemplate jmsQueueTemplate;public void send(){   jmsQueueTemplate.send("queue1", new MessageCreator() {       @Override       public Message createMessage(Session session) throws JMSException {           return session.createTextMessage("我是原始消息");       }   });}

优化:当然,我们不用每次都通过MessageCreator匿名类的方式来创建Message对象,JmsTemplate类中提供了对象实体自动转换为Message对象的方法,convertAndSend(String destinationName, final Object message)。

优化代码示例:

public void convertAndSend(){   jmsQueueTemplate.convertAndSend("queue1", "我是自动转换的消息");}

注:关于消息转换,还可以通过实现MessageConverter接口来自定义转换内容

消息接收

讲完了消息发送,我们最后来说说消息是如何接收的。消息既然是以Message对象的形式发送到指定的目的地,那么消息的接收势必会去指定的目的地上去接收消息。这里采用的是监听者的方式来监听指定地点的消息,采用注解@JmsListener来设置监听方法。

代码示例:

@Componentpublic class Listener1 {   @JmsListener(destination = "queue1")   public void receive(String msg){       System.out.println("监听到的消息内容为: " + msg);   }}

有了监听的目标和方法后,监听器还得和 MQ 关联起来,这样才能运作起来。这里的监听器可能不止一个,如果每个都要和 MQ 建立连接,肯定不太合适。所以需要一个监听容器工厂的概念,即接口JmsListenerContainerFactory,它会引用上面创建好的与 MQ 的连接工厂,由它来负责接收消息以及将消息分发给指定的监听器。当然也包括事务管理、资源获取与释放和异常转换等。

代码示例:

@Beanpublic DefaultJmsListenerContainerFactory jmsQueueListenerContainerFactory() {   DefaultJmsListenerContainerFactory factory =           new DefaultJmsListenerContainerFactory();   factory.setConnectionFactory(connectionFactory());   //设置连接数   factory.setConcurrency("3-10");   //重连间隔时间   factory.setRecoveryInterval(1000L);   return factory;}

场景

代码地址:https://GitHub.com/jasonGeng88/springboot-jms

对 JMS 有了基本的理解后,我们就来在具体的场景中使用一下。

首先,我们需要先启动 ActiveMQ,这里我们以 Docker 容器化的方式进行启动。

启动命令:

docker run -d -p 8161:8161 -p 61616:61616 --name activemq WEBcenter/activemq

启动成功后,在 ActiveMQ 可视化界面查看效果(Http://localhost:8161):

JMS是什么意思

点对点模式(单消费者)

下面介绍消息队列中最常用的一种场景,即点对点模式。基本概念如下:

  1. 每个消息只能被一个消费者(Consumer)进行消费。一旦消息被消费后,就不再在消息队列中存在。
  2. 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列。
  3. 接收者在成功接收消息之后需向队列应答成功。

JMS是什么意思代码实现(为简化代码,部分代码沿用上面所述): 启动文件(Application.java)

@SpringBootApplication@EnableJmspublic class Application {   ...      @Bean   public JmsTemplate jmsQueueTemplate(){       return new JmsTemplate(connectionFactory());   }   public static void main(String[] args) {       SpringApplication.run(Application.class, args);   }}

注解@EnableJms设置在@Configuration类上,用来声明对 JMS 注解的支持。

消息生产者(PtpProducer.java)

@Componentpublic class PtpProducer {   @Autowired   private JmsTemplate jmsQueueTemplate;      public void convertAndSend(){       jmsQueueTemplate.convertAndSend("ptp", "我是自动转换的消息");   }}

生产者调用类(PtpController.java)

@RestController@RequestMapping(value = "/ptp")public class PtpController {   @Autowired   private PtpProducer ptpProducer;   @RequestMapping(value = "/convertAndSend")   public Object convertAndSend(){       ptpProducer.convertAndSend();       return "success";   }}

消息监听容器工厂

@SpringBootApplication@EnableJmspublic class Application {...      @Bean(name = "jmsQueueListenerCF")   public DefaultJmsListenerContainerFactory jmsQueueListenerContainerFactory() {       DefaultJmsListenerContainerFactory factory =               new DefaultJmsListenerContainerFactory();       factory.setConnectionFactory(connectionFactory());       //设置连接数       factory.setConcurrency("3-10");       //重连间隔时间       factory.setRecoveryInterval(1000L);       return factory;   }  ...}

消息监听器

@Componentpublic class PtpListener1 {      @JmsListener(destination = "ptp", containerFactory = "jmsQueueListenerCF")   public void receive(String msg){       System.out.println("点对点模式1: " + msg);   }}

演示

启动项目启动后,通过 REST 接口的方式来调用消息生产者发送消息,请求如下:

curl -XGET 127.0.0.1:8080/ptp/convertAndSend

消费者控制台信息:

JMS是什么意思

ActiveMQ 控制台信息:

JMS是什么意思

列表说明:

  • Name:队列名称。
  • Number Of Pending Messages:等待消费的消息个数。
  • Number Of Consumers:当前连接的消费者数目,因为我们采用的是连接池的方式连接,初始连接数为 3,所以显示数字为 3。
  • Messages Enqueued:进入队列的消息总个数,包括出队列的和待消费的,这个数量只增不减。
  • Messages Dequeued:出了队列的消息,可以理解为是已经消费的消息数量。

点对点模式(多消费者)

基于上面一个消费者消费的模式,因为生产者可能会有很多,同时像某个队列发送消息,这时一个消费者可能会成为瓶颈。所以需要多个消费者来分摊消费压力(消费线程池能解决一定压力,但毕竟在单机上,做不到分布式分布,所以多消费者是有必要的),也就产生了下面的场景。

JMS是什么意思

代码实现

添加新的监听器

@Componentpublic class PtpListener2 {   @JmsListener(destination = Constant.QUEUE_NAME, containerFactory = "jmsQueueListenerCF")   public void receive(String msg){       System.out.println("点对点模式2: " + msg);   }}

演示 这里我们发起 10 次请求,来观察消费者的消费情况:

JMS是什么意思

这里因为监听容器设置了线程池的缘故,在实际消费过程中,监听器消费的顺序会有所差异。

发布订阅模式

除了点对点模式,发布订阅模式也是消息队列中常见的一种使用。试想一下,有一个即时聊天群,你在群里发送一条消息。所有在这个群里的人(即订阅了该群的人),都会收到你发送的信息。

基本概念:

  1. 每个消息可以有多个消费者。
  2. 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。
  3. 为了消费消息,订阅者必须保持运行的状态。

JMS是什么意思代码实现 修改 JmsTemplate 模板类,使其支持发布订阅功能

@SpringBootApplication@EnableJmspublic class Application {   ...   @Bean   public JmsTemplate jmsTopicTemplate(){       JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory());       jmsTemplate.setPubSubDomain(true);       return jmsTemplate;   }   ...}

消息生产者(PubSubProducer.java)

@Componentpublic class PtpProducer {   @Autowired   private JmsTemplate jmsTopicTemplate;   public void convertAndSend(){ jmsTopicTemplate.convertAndSend("topic", "我是自动转换的消息");   }}

生产者调用类(PubSubController.java)

@RestController@RequestMapping(value = "/pubsub")public class PtpController {   @Autowired   private PubSubProducer pubSubProducer;   @RequestMapping(value = "/convertAndSend")   public String convertAndSend(){       pubSubProducer.convertAndSend();       return "success";   }}

修改 DefaultJmsListenerContainerFactory 类,使其支持发布订阅功能

@SpringBootApplication@EnableJmspublic class Application {...      @Bean(name = "jmsTopicListenerCF")   public DefaultJmsListenerContainerFactory jmsTopicListenerContainerFactory() {       DefaultJmsListenerContainerFactory factory =               new DefaultJmsListenerContainerFactory();       factory.setConnectionFactory(connectionFactory());       factory.setConcurrency("1");       factory.setPubSubDomain(true);       return factory;   }  ...}

消息监听器(这里设置2个订阅者)

@Componentpublic class PubSubListener1 {   @JmsListener(destination = "topic", containerFactory = "jmsTopicListenerCF")   public void receive(String msg){       System.out.println("订阅者1 - " + msg);   }}@Componentpublic class PubSubListener2 {   @JmsListener(destination = "topic", containerFactory = "jmsTopicListenerCF")   public void receive(String msg){       System.out.println("订阅者2 - " + msg);   }}

演示

curl -XGET 127.0.0.1:8080/pubSub/convertAndSend

消费者控制台信息:

JMS是什么意思

ActiveMQ 控制台信息:

JMS是什么意思

看完了这篇文章,相信你对“JMS是什么意思”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: JMS是什么意思

本文链接: https://www.lsjlt.com/news/310285.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JMS是什么意思
    小编给大家分享一下JMS是什么意思,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用...
    99+
    2023-06-27
  • J2EE是什么意思2又是什么意思
    J2EE是Java 2 Platform, Enterprise Edition的缩写,意思是Java 2企业级平台。它是一种用于开...
    99+
    2023-09-20
    J2EE
  • xml是什么意思
    一、元素定义 XML的元素定义是由开发者自行确定的,每个元素都由一个开始标签和一个结束标签组成,元素中可以包含文本、其他元素或者属性。 二、属性和值 XML元素可以包含属性,每个属性都有一个名称和一个值。例如,在一个XML...
    99+
    2023-10-29
    xml
  • dashboard是什么意思
    dashboard是一个用于可视化数据和监控系统的工具。用于展示和监控应用程序的关键指标和数据的用户界面,提供了一个集中的平台,让你能够快速了解应用程序的性能和运行状况,就像掌握了你家中各种设备的状态一样。dashboard就像一个商店的橱...
    99+
    2023-11-22
    dashboard
  • Rust是什么意思
    小编给大家分享一下Rust是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Rust 是什么Rust 是一种系统编程语言,它运行速度惊人,并且可以避免几乎所...
    99+
    2023-06-16
  • LVS是什么意思
    这篇文章主要介绍LVS是什么意思,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、LVS概念LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,...
    99+
    2023-06-16
  • chatgpt是什么意思
    chatgpt是美国OpenAI开发的全新聊天机器人模型,它能通过学习和理解人类的语言进行对话,并根据聊天的上下文进行互动,协助人类...
    99+
    2023-02-08
    chatgpt
  • mybatis是什么意思
    这篇文章主要为大家展示了“mybatis是什么意思”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mybatis是什么意思”这篇文章吧。什么是mybatis:Mybatis本质是一种半自动化的OR...
    99+
    2023-06-27
  • ingress是什么意思
    ingress是基于域名的网络转发资源的意思。ingress是对集群中服务的外部访问进行管理的API对象,典型的访问方式是HTTP和HTTPS。Ingress可以提供负载均衡、SSL和基于名称的虚拟托管。ingress简介ingress是基...
    99+
    2023-07-10
  • ed是什么意思
    Ed是一种基本的文本编辑器,最早于1971年在Unix操作系统中开发。Ed编辑器的操作方式与其他编辑器不同,没有图形界面,所有操作都通过键盘命令完成。在Unix系统中,Ed编辑器通常被用作系统故障或其他紧急情况下的默认编辑器,因为它在资源受...
    99+
    2023-08-17
  • display:none是什么意思
    "display:none" 是CSS中一种样式属性,用于隐藏元素,使其不在页面上显示。当一个元素的"display"属性值设置为"...
    99+
    2023-08-30
    意思
  • mysqlinstaller是什么意思
    MySQLInstaller是MySQL官方提供的一个安装程序,用于方便地下载、安装和配置MySQL数据库服务器以及相关组件,使用MySQL Installer可以简化MySQL的安装和设置过程。本教程操作系统:Windows10系统、My...
    99+
    2023-08-02
  • remove是什么意思
    remove是从数据结构中删除一个元素、节点或字符的意思,具体的实现方式取决于所使用的编程语言和数据结构。无论是数组、链表还是字符串,remove操作都是程序员经常使用的操作之一,对于数据处理和算法实现都非常重要。本教程操作环境:windo...
    99+
    2023-08-04
  • c#是什么意思
    c#是一种通用的面向对象编程语言,由微软公司开发并推出。它是在.NET框架上运行的一种编程语言,可以用于开发各种类型的应用程序,包括桌面应用、Web应用、移动应用和游戏等。C#还提供了许多高级特性,如委托、事件、属性和泛型等,使得开发者可以...
    99+
    2023-08-08
  • visible是什么意思
    visible属性是一个布尔类型的值,通常用于控制对象、控件或窗口的可见性,当visible属性设置为true时,表示对象是可见的,它将在屏幕上显示出来,而当visible属性设置为false时,表示对象是隐藏的,它将不会在屏幕上显示。Vi...
    99+
    2023-08-10
  • pm是什么意思
    PM是Project Manager的缩写,意为项目经理,项目经理是一个管理项目的专业角色,在软件开发等领域中尤为重要,负责项目的规划、组织、管理和监督,需要具备多方面的能力,包括管理、沟通、领导和技术知识,确保项目按时交付、在预算范围内,...
    99+
    2023-08-10
  • mysql 是什么意思
    MySQL是一种开源的关系型数据库管理系统(RDBMS),它是由瑞典MySQL AB公司开发的,现在属于Oracle公司。MySQL...
    99+
    2023-09-05
    mysql
  • href是什么意思
    href是HTML中的属性,用于指定链接的目标地址。它通常用于锚点标签()中,可以将链接指向另一个网页、文件或特定位置。例如,点击这...
    99+
    2023-09-26
    href
  • numpy是什么意思
    numpy是一个用于科学计算的Python库。提供了一个强大的多维数组对象和处理这些数组的工具,可以方便地进行数值计算、数据操作、线性代数计算等等。numpy的ndarray对象可以存储同类型的数据,比Python原生的列表对象更高效,还支...
    99+
    2023-11-21
    numpy numpy库
  • php 是什么意思
    本文操作环境:Windows7系统、PHP7.4版、DELL G3电脑php是什么意思 ?PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并...
    99+
    2015-10-12
    php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作