JMS及其API介绍

article/2025/9/22 4:21:45

        Java Message Service是java ee的规范之一,可以用来发送异步消息,在某些场景下,可以作为不同系统,或者不同模块之间的集成方式。 

        可以类比为通过数据库来集成的方式,模块A完成逻辑以后,往数据库插入一条记录,模块B定时轮询数据库,如果查到相应的记录,就进行处理。jms集成实际上思路是差不多的,只是功能更强,并且提供了标准的API支持,而且也可以避免反复轮询数据库或者读取文件的I/O操作,对系统的整体性能会有提升。 其主要优点,首先是可以使2个系统或模块实现松耦合,模块A不需要直接调用模块B,只需要往jms provider上发送一条约定格式的消息,模块B收到这条消息,进行后续的业务处理 。其次,jms方式是异步的,意味着模块A发送消息之后,不需要等待模块B或者jms provider的响应,自身的业务逻辑可以继续。 

        jms技术对应的规范是jsr914,规范的实现称为jms provider,常见的实现有ActiveMQ、JBoss MQ、IBM Websphere MQ等。本文以ActiveMQ举例 。

一、ActiveMQ使用 

       ActiveMQ(其他的jms provider也差不多)安装之后,目录结构是这样的: 

 
 
       运行bin目录下的activemq.bat,会根据默认配置,启动一个broker。各种jms实现,都有broker的概念。 

        启动之后,会占用至少2个端口,默认的是61616和8161 。61616是等待jms client的连接,8161是ActiveMQ自带的一个web应用 。

        http://localhost:8161/demo,可以看到各种官方提供的例子, http://localhost:8161/admin,是ActiveMQ的管理控制台。 

 

        这里可以对队列进行各种操作,比如发送消息,查看消息,清空队列等等 。

        ActiveMQ即使在不编程的情况下,也可以通过这种方式来使用,包括我之前的公司,是用Websphere MQ,有时也不编程,直接通过Websphere MQ,在两地进行消息传输。当然,大部分情况,还是需要针对jms client进行编程的 。

二、jms基本概念 

         前面说过,jms的实现,称为jms provider,可以认为是jms的服务器 。

         jms的客户端,需要开发人员自行开发,称为jms client 。

         jms的消息机制有2种模型,一种是Point to Point,表现为队列的形式。发送的消息,只能被一个接收者取走 。另一种是Topic,可以被多个订阅者订阅,类似于群发。 

 

ConnectionFactory,用于jms client获取与jms provider的连接。不同的jms产品,对这个接口有不同的实现,比如说ActiveMQ,这个接口的实现类是ActiveMQConnectionFactory 

Connection,是由ConnectionFactory产生的,表示jms client与jms provider的连接 

Session,是由Connection产生的,表示一个会话。Session是关键组件,Message、Producer/Consumer、Destination都是在Session上创建的 

Message,这个组件很好理解,就是传输的消息,里面包括head、properties、body,其中head是必选的 

Destination,是消息源,对发送者来说,就是消息发到哪里;对接收者来说,就是从哪里取消息。Destination有2个子接口,Queue和Topic,分别对应上面提到的2种模型 

Message Producer,是消息发送者,创建这个组件的代码类似: 

Java代码  收藏代码
  1. Destination dest = session.createQueue("dotaQueue");// 消息目的地  
  2.   
  3. MessageProducer producer = session.createProducer(dest);// 消息发送者  


        可以注意到,这里需要把Destination作为参数,传入createProducer()方法,这说明消息发送者是绑定到Destination上的,这个发送者发送的消息,会发送到这个绑定的Destination上 。
        Message Consumer,是消息接收者,和Message Producer是相反的一种组件。 

三、代码实例 

        这里是基于ActiveMQ进行开发,所以需要导入ActiveMQ提供的jar包。不过开发时,应该尽量针对jms接口进行开发,不依赖特定的实现。 
        例子是用main函数跑的,没有在java ee容器里跑,所以没有办法依赖JNDI拿到ConnectionFactory的实例,只能手工创建ActiveMQConnectionFactory,所以和ActiveMQ的实现耦合了,没有办法连到别的jms实现上。如果实际的代码,用JNDI或者spring来获取ConnectionFactory的实例的话,那就可以仅针对接口编程,连接到任意jms provider了。 

         为了简单起见,例子也没有用到spring,实际上spring对jms client提供了很好的支持,在后面再介绍。

         开发环境只要导入activemq-all-5.6.0.jar就可以了 。

 

里面已经包括了jms API、activemq-core、javaee-management API等必须的class 

首先是Message Producer的例子: 

 

Java代码  收藏代码
  1. public class Main {  
  2.   
  3.     public static void main(String[] args) throws JMSException {  
  4.   
  5.         String jmsProviderAddress = "tcp://localhost:61616";// 地址  
  6.   
  7.         ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(  
  8.                 jmsProviderAddress);// 连接器  
  9.   
  10.         Connection connection = connectionFactory.createConnection();// 创建连接  
  11.   
  12.         Session session = connection.createSession(false,  
  13.                 Session.AUTO_ACKNOWLEDGE);// 打开会话  
  14.   
  15.         Destination dest = session.createQueue("demoQueue");// 消息目的地  
  16.   
  17.         MessageProducer producer = session.createProducer(dest);// 消息发送者  
  18.   
  19.         Message message = session.createTextMessage("hello world");// 消息  
  20.   
  21.         producer.send(message);// 发送  
  22.   
  23.         producer.close();// 关闭  
  24.         session.close();  
  25.         connection.close();  
  26.   
  27.     }  
  28.   
  29. }  

代码很简单,可以参考上面的图,各组件的关系是比较清楚的 

然后是Message Consumer的例子: 
Java代码  收藏代码
  1. public static void main(String[] args) throws JMSException {  
  2.   
  3.         String jmsProviderAddress = "tcp://localhost:61616";// 地址  
  4.   
  5.         ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(  
  6.                 jmsProviderAddress);// 连接器  
  7.   
  8.         Connection connection = connectionFactory.createConnection();// 创建连接  
  9.   
  10.         Session session = connection.createSession(false,  
  11.                 Session.AUTO_ACKNOWLEDGE);// 打开会话  
  12.   
  13.         String destinationName = "demoQueue";  
  14.   
  15.         Destination dest = session.createQueue(destinationName);// 消息目的地  
  16.   
  17.         MessageConsumer consumer = session.createConsumer(dest);  
  18.   
  19.         connection.start();  
  20.   
  21.         Message message = consumer.receive();  
  22.   
  23.         TextMessage textMessage = (TextMessage) message;  
  24.   
  25.         String text = textMessage.getText();  
  26.   
  27.         System.out.println("从ActiveMQ取回一条消息: " + text);  
  28.   
  29.         consumer.close();  
  30.         session.close();  
  31.         connection.close();  
  32.   
  33.     }  


和MessageProducer的代码基本类似,实际中一般会实现javax.jms.MessageListener接口,这样就不需要手工调用receive()方法。

如下代码所示:

// Connection :JMS 客户端到JMS Provider 的连接final Connection connection =  connectionFactory.createConnection();connection.start();// Session: 一个发送或接收消息的线程final Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);// Destination :消息的目的地;消息送谁那获取.Destination destination =  session.createQueue("demoQueue");// 消费者,消息接收者MessageConsumer consumer1 =  session.createConsumer(destination);consumer1.setMessageListener(new MessageListener() {@Overridepublic void onMessage(Message msg) {try {TextMessage message = (TextMessage)msg ;System.out.println("consumer1收到消息: "+message.getText());session.commit();} catch (JMSException e) {				e.printStackTrace();}}});// 再来一个消费者,消息接收者MessageConsumer consumer2 =  session.createConsumer(destination);consumer2.setMessageListener(new MessageListener() {@Overridepublic void onMessage(Message msg) {try {TextMessage message = (TextMessage)msg ;System.out.println("consumer2收到消息: "+message.getText());session.commit();} catch (JMSException e) {				e.printStackTrace();}}});}


 


http://chatgpt.dhexx.cn/article/Zawh6o0q.shtml

相关文章

Springboot 整合 JMS

ActiveMQ JMS 仅支持 Java 平台。 由于 JMS 是一套标准,所以 SpringBoot 整合 JMS 必然是整合 JMS 的某一个实现。 Apache ActiveMQ 是一个开源的消息中间件,完全支持 JMS 1.1 规范,支持多种编程语言( C、C、C#、Delphi、Erlang、AdobeFla…

1.JMS规范介绍

目录 1.什么是JMS规范 2.什么是MOM 3.MOM的特点 4.JMS和MOM的关联 5.JMS的体系结构 6.JMS常见基本概念 7.JMS 的事务性会话和非事务性会话 8.JMS消息的可靠性机制 1.什么是JMS规范 Java 消息服务(Java Message Service)是 java 平台中关于面向消息…

JMS 示例

JMS 开发示例。 使用weblogic8作为jms server。 1、在weblogic中配置JMS。 配置JMS connection factory 配置JMS File Store 配置JMS Server 配置JMS destination 2、创建JMS Sender package jms; import java.util.Hashtable; import javax.jms.JMSE

ActiveMQ详解一 —— JMS介绍

1. JMS概述 不同系统之间信息交换,有多种方式。 SUN公司提出了一种面向详细的中间件服务—— JMS,Java消息服务,是JavaEE的标准/规范之一。 JMS指出:消息的发送应该是异步的、非阻塞的。 也就是说,消息的发送者发送…

SpringBoot整合JMS

SpringBoot整合JMS 文章目录 SpringBoot整合JMS前言一、JMS、AMQP概念以及区别二、ActiveMQ安装三、SpringBoot整合ActiveMQ:队列模式实例1、创建demo项目2、添加依赖3、添加application配置4、添加配置文件ActiveMQConfig5、创建JMS组件文件6、发送消息控制器7、测…

JMS规范介绍

目录 1.什么是JMS规范 2.什么是MOM 3.MOM的特点 4.JMS和MOM的关联 5.JMS的体系结构 6.JMS常见基本概念 7.JMS 的事务性会话和非事务性会话 8.JMS消息的可靠性机制 1.什么是JMS规范 Java 消息服务(Java Message Service)是 java 平台中关于面向消息…

JMS规范

一、JMS经典模式详解 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM,Message oriented Middleware)的API,用于在两个应用程序之间&#xff0c…

微服务 —— 消息服务中间件 JMS

一、消息服务中间件 对于大多数应用来说,可采用消息服务中间件来提升系统异步通信,消息解耦问题。 消息的作用:异步处理、应用解耦、流量削峰。 异步消息中的两个概念:消息代理、目的地 当消息发送者发送消息,由消息…

JMS解析(二)——JMS简介

JMS解析(一)——JMS简介_踩踩踩从踩的博客-CSDN博客 前言 本篇文章会紧接着上篇文章未介绍完毕的JMS规范,继续消息接收、事务管理、持久化以及应用的介绍。 消息接收 消息接收分为队列接收和topic消息接收 对于队列的接收基本的consumer…

JMS(Java消息服务)(Activemq简单介绍)

是什么? JMS(java消息服务)是规范,它定义了一些规则,一些接口。具体实现由各种做这个产品的厂家或开源组织来实现。 为什么? 在JMS还没有诞生前,每个企业都会有自己的一套内部消息系统&#…

JMS解析(一)——JMS简介

消息中间件MQ及ActiveMQ介绍_踩踩踩从踩的博客-CSDN博客 前言 上篇文章对消息中间件做了个解析,以及ActiveMQ的安装和基本使用,做了个基本了解,因为如果不了JMS规范,一定是不学不好消息中间件和ActiveMQ,本篇文章会从JMS是什么&…

JMS基本概念

简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消…

JMS概述

** 一、什么是JMS ** JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行…

深入浅出JMS(一)——JMS简介

如果手机只能进行实时通话,没有留言和短信功能会怎么样?一个电话打过来,正好没有来得及接上,那么这个电话要传递的信息肯定就收不到了。为什么不能先将信息存下来,当用户需要查看信息的时候再去获得信息呢?伴随着这个疑惑,短息和留言应运而生,无论手机是否开机、是否未…

详解 ROI Align 的基本原理和实现细节

转载至http://blog.leanote.com/post/afanti.denggmail.com/b5f4f526490b 欢迎支持原作者。 ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。实验显示,在检测测任务…

眼睛ROI区域裁剪

为了用深度方法训练一个睁闭眼模型,这里不需要再提取特征,而是需要用到眼睛的原图,第一步就是把眼睛区域裁剪下来。 本文用的是opencv的检测库shape_predictor_68_face_landmarks.dat,得到68特征点后,根据特征点来裁剪…

目标检测Fast RCNN中的ROI pooling

目标检测的任务可以分为两步:选出所有可能存在物体的候选框、判断候选框中的物体是否为前景或者背景。 但是这可能会产生很多的候选区域,如果把它们都喂入CNN,计算量将特别大,这也是rcnn效率低的原因所在。rcnn对每个候选区域都进…

ROI Pooling原理及实现

目标检测architecture通常可以分为两个阶段: (1)region proposal:给定一张输入image找出objects可能存在的所有位置。这一阶段的输出应该是一系列object可能位置的bounding box。这些通常称之为region proposals或者 regions of …

ROI数据分析

目录 1. 专业术语解读 2. 参考资料 1. 专业术语解读 ROI(Return On Investment)投入产出比ROI 是指通过投资而应返回的价值,即企业从一项投资活动中得到的经济回报,通俗点来说就是我们获得的收益和投入成本的比值。 如下图所示,比较多个渠道的效果,寻找最大的ROI渠道。…

ROIAlign源码详细解析

ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。 其中ROI Align用的是双线性插值(内插)来实现的,在分析源码前我们先来了解下什么是双线性插值。 插值定义&#xf…