java消息中间件学习-JMS两种消息模式及代码示例

JMS 消息队列接口基本使用指南 阅读详情

demo示例代码下载:

https://download.youkuaiyun.com/download/qq_43560721/12799687

 

JMS消息模式:

1.队列模式P2P

特点:客户端包括生产者和消费者;队列中的消息只能被一个消费者消费;消费者可以随时消费队列中的消息

解释:P2P (点对点)消息域使用 queue 作为 Destination,消息可以被同步或异步的发送和接收,每个消息只会给一个 Consumer 传送一次。

Consumer 可以使用 MessageConsumer.receive() 同步地接收消息,也可以通过使用MessageConsumer.setMessageListener() 注册一个 MessageListener 实现异步接收。

多个 Consumer 可以注册到同一个 queue 上,但一个消息只能被一个 Consumer 所接收,然后由该 Consumer 来确认消息。并且在这种情况下,Provider 对所有注册的 Consumer 以轮询的方式发送消息。

队列模式的消息演示:

创建生产者:

package cn.xxs.jms.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Author xxs
 * @Date 2020/9/2 14:43
 */
public class AppProducer {
    private static final String url = "tcp://192.168.4.123:61616";
    private static final String queueName = "queue-test";
    public static void main(String[] args) throws JMSException {

        //创建ConnectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        //创建Connection
        Connection connection = connectionFactory.createConnection();
        //启动连接
        connection.start();
        //创建会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建一个目标
        Destination destination = session.createQueue(queueName);
        //创建一个生产者
        MessageProducer producer = session.createProducer(destination);
        for (int i=0;i<10;i++){
            //创建消息
            TextMessage textMessage = session.createTextMessage("test message"+i);
            //发布消息
            producer.send(textMessage);
            System.out.println("发送消息"+textMessage.getText());
        }
        //关闭连接
        connection.close();

    }
}

运行代码后,控制台打印如下:

我们去ActiveMQ看一下可以看到刚刚发送的10条消息:

创建消费者:

package cn.xxs.jms.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Author xxs
 * @Date 2020/9/2 15:55
 */
public class AppConsumer {
    private static final String url = "tcp://192.168.4.123:61616";
    private static final String queueName = "queue-test";
    public static void main(String[] args) throws JMSException {

        //创建ConnectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        //创建Connection
        Connection connection = connectionFactory.createConnection();
        //启动连接
        connection.start();
        //创建会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建一个目标
        Destination destination = session.createQueue(queueName);
        //创建一个消费者
        MessageConsumer consumer = session.createConsumer(destination);
        //创建一个监听器
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("接收消息:"+textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

运行代码后,控制台打印如下:

我们去ActiveMQ看一下可以看到刚刚发送的10条消息已经被消费:

我们可以再创建一个消费者2和消费者一起消费生产者生产的消息。

运行两个消费者,然后运行生产者。

生产者生产10条消息:

消费者1

消费者2

由上可以看出消费者平均消费生产者产生的消息,由此总结

 

2.主题模式Pub/Sub

特点:客户端包括发布者和订阅者;主题中的消息被所有订阅者消费;消费者不能消费订阅之前就发送到主题中的消息

解释:Pub/Sub(发布/订阅,Publish/Subscribe)消息域使用 topic 作为 Destination,发布者向 topic 发送消息,订阅者注册接收来自 topic 的消息。发送到 topic 的任何消息都将自动传递给所有订阅者。接收方式(同步和异步)与 P2P 域相同。
除非显式指定,否则 topic 不会为订阅者保留消息。当然,这可以通过持久化(Durable)订阅来实现消息的保存。这种情况下,当订阅者与 Provider 断开时,Provider 会为它存储消息。当持久化订阅者重新连接时,将会受到所有的断连期间未消费的消息。

队列模式的消息演示:

创建发布者:

package cn.xxs.jms.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Author xxs
 * @Date 2020/9/2 14:43
 */
public class AppProducer {
    private static final String url = "tcp://192.168.4.123:61616";
    private static final String topicName = "topic-test";
    public static void main(String[] args) throws JMSException {

        //创建ConnectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        //创建Connection
        Connection connection = connectionFactory.createConnection();
        //启动连接
        connection.start();
        //创建会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建一个目标(主题)
        Destination destination = session.createTopic(topicName);
        //创建一个生产者
        MessageProducer producer = session.createProducer(destination);
        for (int i=0;i<10;i++){
            //创建消息
            TextMessage textMessage = session.createTextMessage("test message"+i);
            //发布消息
            producer.send(textMessage);
            System.out.println("发送消息"+textMessage.getText());
        }
        //关闭连接
        connection.close();

    }
}

运行代码:

创建消费者:

两个消费者代码一样

package cn.xxs.jms.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Author xxs
 * @Date 2020/9/2 15:55
 */
public class AppConsumer {
    private static final String url = "tcp://192.168.4.123:61616";
    private static final String topicName = "topic-test";
    public static void main(String[] args) throws JMSException {

        //创建ConnectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        //创建Connection
        Connection connection = connectionFactory.createConnection();
        //启动连接
        connection.start();
        //创建会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建一个目标
        Destination destination = session.createTopic(topicName);
        //创建一个消费者
        MessageConsumer consumer = session.createConsumer(destination);
        //创建一个监听器
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("接收消息:"+textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

运行两个消费者代码发现什么都没有接收到,这里就是注意点:

消费者不能消费订阅之前就发送到主题中的消息

所以我们再次运行生产者发布10条消息:

然后发现两个消费者都消费了刚刚重新运行生产者我生产的10条消息,如下图:

  

由上可以看出消费者全部消费生产者产生的消息,由此总结

 

MSMQ to JMS-开源 该项目只是MSMQ和JMS(JAVA)之间的桥梁。 基于有助于使用Visual C ++创建DLL的JNI概念。 Java方法调用用于生成dll的C ++类,并且此C ++类返回MSMQ的消息。 立即下载

相关推荐

基于STM32与SimpleFOC实现直流无刷电机开环控制的实战指南

本文提供了一份基于STM32微控制器与SimpleFOC开源库实现直流无刷电机开环控制的详细实战指南。内容涵盖硬件连接、PlatformIO环境搭建、核心代码解析及上电测试,旨在帮助开发者快速验证硬件并理解开环控制的基本原理,为后续实现高性能的闭环FOC控制奠定基础。

xxx12的博客 959

【JMS】JMS之ActiveMQ的使用

这篇文章主要是简单介绍一下JMS和ActiveMQ,以及使用ActiveMQ来写两个demo。1. JMS是啥百度百科的解释: JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都

8793

SVM-支持向量机学习(1):线性可分SVM的基本型

1. foreword先看的是李航老师的书第7章,比较传统按照以下三节展开: 线性可分SVM 线性SVM 非线性SVM SMO算法 李航老师讲东西向来不拖泥带水,但本节也几乎用了40页的篇幅,足见涉及内容之多。7月底硬着头皮啃了下来,边看边在笔记上摘抄标注,花了2天时间对SVM有了基本认识。一个月过去了,如今重新整理为博客,再看轻松许多,并不断对比西瓜书的内容,启望达到融会贯通。西瓜书此节明显节奏轻

鸟恋旧林的博客 8679

Spring 集成 JMS 连接 ActiveMQ

使用 Spring 配置 JmsTemplate 连接 ActiveMQ 进行消息的传递。

LeifChen的博客 398

ANSYS Workbench实战:用网格自适应搞定超弹性橡胶大变形仿真(附避坑命令流)

本文深入探讨了ANSYS Workbench中超弹性橡胶大变形仿真的网格自适应技术,重点解析了混合U-P单元的应用、非线性自适应网格的实战技巧及材料模型选择的注意事项。通过具体案例和命令流示例,帮助工程师有效解决橡胶仿真中的收敛问题和网格畸变挑战,提升仿真精度和效率。

weixin_42666036的博客 303

华为[ENSP]—— 实验二、三层交换和ARP的工作原理

华为[ENSP]三层交换和ARP的工作原理

weixin_62594100的博客 6409

jms连接方法及相关代码

jms连接方法及相关代码

qq_32930833的博客 653

uniapp:APP报错Error: Not Found:Page[2][-1,1;-1,1,0,0,2-0] at view.umd.min.js:1(uniApp安卓苹果ios出现一大堆数字错误)

Error: Not Found:Page[2][一串数字] at view.umd.min.js:1,uniapp在APP端运行报错Error: Not Found:Page[2][-1,1;-1,1,0,0,2-0] at view.umd.min.js:1,uniapp真机运行偶尔出现Not Found:Page[2][-1,28] at view.umd.min.js:1,如何解决uniApp app报错:Not found -1,71 at view.umd.min.js:1,uniapp项目在H

✅ 精选推荐文章 3983

SYSV IPC-消息队列

占位

Edidaughter的博客 651

Python爬虫实战:58同城租房信息分析与可视化,寻找高性价比房源

随着城市化进程加快,租房需求日益增长。58同城作为国内领先的本地生活服务平台,汇聚了大量房源信息。本教程将使用最新的Python爬虫技术获取58同城租房数据,通过数据分析与可视化揭示各区域租金水平,并运用机器学习算法找出性价比高的房源。本项目将使用异步爬虫、反爬对抗技术、数据清洗、可视化分析和机器学习建模等技术栈。

2201_76125261的博客 1279

【毕业设计】基于雷达与深度学习的摔倒检测——雷达数据集的建立

运动物体的微多普勒效应为人体动作识别提供了可能,基于雷达的居家检测具有良好的隐私保护性,且不易受环境因素影响(如光照、温度等),近年来已受到国内外学者的广泛关注。基于雷达与深度学习的摔倒检测使用自建的雷达数据集进行人体摔倒检测的研究。雷达数据集的建立分为雷达数据采集和雷达数据处理两部分工作。

洋洋Young的博客 3403

消息中间件学习笔记

中间件基本概念 什么是中间件? 非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件。 什么是消息中间件? 关注于数据的发送和接受,利用高效可靠的异步消息传递机制集成分布式系统。 什么是JMS? Ja...

一个编程小白的个人技术博客 6945

【异常】XXL-JOB提示异常ERROR com.xxl.job.core.util.XxlJobRemotingUtil - connect timed out

打开XXL-JOB的ELK,发现一堆报错。

奶爸的编程之路,也就一周冷个三天 2046

Java消息中间件---基础篇

学习慕课网java消息中间件记些笔记1.概述中间件 非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件。 消息中间件 管制关注于数据的发送和接收,利用高效可靠的异步消息传递机制集成分布式系统。 优点 ① 解耦 ② 异步 ③ 横向扩展 ④ 安全可靠 ⑤ 顺序保证(比如kafka) jms java消息服务(Java Messag

u013123635的博客 4万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JMS(Java Message Service)使用指南

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。它是一种与厂商无关的API,用来访问消息收发系统消息,类似于JDBC(Java Database Connectivity)。在JMS中,消息是JMS中的一种类型对象,由两部分组成:报头和消息主体。消息主体则携带着应用程序的数据或有效负载。

技术人集结地 4206

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JMS学习笔记

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

Hello World! 768

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

消息中间件 activeMQ 及 JMS 学习

1、消息中间件         消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有Producer(生产者)、Consumer(消费者)。 常见的消息中间件产品: (1)ActiveMQ ActiveMQ 是Apache出品,最流行的,能...

py_tamir的博客 309

java 消息中间件_学习笔记--Java消息中间件

消息中间件消息中间件:关注于数据的发送和接受,利用高效可靠的异步消息传递机制集成分布式系统JMS:Java消息服务,Java平台中关于面向消息中间件的APIAMQP:提供统一消息服务的应用层标准协议常见消息中间件ActiveMQRabbitMQKafkaJMS规范提供者:实现JMS规范的消息中间件服务器客户端:发送或接受消息的应用程序生产者/发布者:创建并发送消息的客户端消费者/订阅者:接收并处理...

weixin_42414212的博客 568

Java消息中间件入门与实践

跟我Java消息中间件一、Java消息中间件简介1.1 消息中间件概述1.2 消息中间件图示1.3 常见消息中间件对比1.3.1 ActiveMQ1 概述2 特性1.3.2 RabbitMQ1 概述2 特性1.3.3 Kafka1 概述2 特性1.3.4 综合评价1.4 JMS1.4.1 JMS规范1 JMS相关概念2 JMS消息模式a 队列模型b 主体模型3 JMS编码接口1 常用接口2 JMS...

夜月鸿影的博客 932

Java中间件JMS(五)之JMS入门

JMS 的概念 JMS(Java Message Service),即 Java 消息服务,是一组 Java 应用程序接口,用以提供创 建、发接、接收、读取消息的服务。SUN 只提供接口,由不同的厂商根据该接口提供自己 的实现。 JMS 的中间件 � IBM MQ 系列产品提供的服务使得应用程序可以使用消息队列进行交流,通过一系列 基于 Java 的 API 提供了 MQseri

dwc_fly的专栏 3580

Jms规范学习

1、什么是消息中间件?  关注于数据的发送和接受,利用高效可靠的异步消息传递机制集成分布式系统。 2、什么是JMS?  Java消息服务(java Message Service)即JMS,是一个java平台中关于面向消息中间件的API,用于在两个应用程序之间或者分布式系统中发送消息,进行异步通信。 3、什么是AMQP?  AMQP(即advanced message queuing...

HiterCoder 154

科普文:软件架构MQ系列之【JMS Java消息服务(Java Message Service)】

JMS 是 Java Message Service 的简称,即 Java 消息服务。JMS 只定义了 Java 中访问消息中间件的接口,并没有给予实现,实现 JMS 接口的消息中间件称为 JMS Provider。如 Apache 的 ActiveMQ、Kafka、以及阿里巴巴的 RocketMQ。‌JMS是一个Java平台中关于面向消息中间件(MOM)的应用程序接口(API),用于在两个应用程序之间或分布式系统中发送消息,进行异步通信。

为无为,事无事,味无味。 1889

消息中间件-学习总结一

消息中间件知识总结,kafka/rabbitmq相关

qq_28136919的博客 670

Java消息中间件学习笔记二 -- JMS规范

JMS相关概念 提供者:实现JMS规范的消息中间件服务器 客户端:发送或接收消息的应用程序 生产者/发布者:创建并发送消息的客户端 消费者/订阅者:接受并处理消息的客户端 消息:应用程序之间传递的数据内容 消息模式:在客户端之间传递消息的方式,JMS中定义了主题和队列两种模式 JMS消息模式队列模型 客户端包含生产者和消费者 队列中的消息只能被一个消费者消费 消费者可以随时消费队列中的消息 主题模型

LuisChen的博客 967

jms与ActivityMQ中的简单使用

一 .什么是消息中间件 1,消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有Producer(生产者)、Consumer(消费者) 生活中的例子:比如现在出现的各种快递柜或者E栈其实就相当于我们变成邻域的消息中间件,如果没有...

bird_tp的博客 502

消息中间件之RabbitMQ学习--小结一

1. 消息中间件概述 1.1. 什么是消息中间件 MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。 为什么使用MQ 在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。 开发中消息队列通常有如下应用场景: 1、任务异步处理 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。 2、应用程序解耦合 M

m0_61703149的博客 311
上一篇: java消息中间件学习-win安装activemq
下一篇: java消息中间件学习-Spring集成JMS连接ActiveMQ
小小舍
博客等级 码龄8年 340粉丝 273原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值