JMS消息可靠机制

39、JMS消息接收与处理全解析 本文深入解析了JMS(Java Message Service)中的消息接收与处理机制,包括同步与异步消息消费方式、消息选择器的使用、可靠性保障机制、消息驱动Bean(MDB)的开发与应用。同时,对比了不同消息处理方式的优缺点及适用场景,并讨论了实际应用中的资源管理、异常处理和性能优化等关键问题。最后,展望了JMS在未来分布式系统中的发展趋势。通过本文,开发者可以全面掌握JMS的核心概念和技术,构建高效、可靠的消息驱动系统。 阅读详情

JMS消息可靠机制

ActiveMQ消息签收机制:

客戶端成功接收一条消息的标志是一条消息被签收,成功应答。

消息的签收情形分两种:

1、带事务的session

   如果session带有事务,并且事务成功提交,则消息被自动签收。如果事务回滚,则消息会被再次传送。

2、不带事务的session

   不带事务的session的签收方式,取决于session的配置。

   Activemq支持一下三種模式:

   Session.AUTO_ACKNOWLEDGE  消息自动签收

   Session.CLIENT_ACKNOWLEDGE  客戶端调用acknowledge方法手动签收

textMessage.acknowledge();//手动签收

   Session.DUPS_OK_ACKNOWLEDGE 不是必须签收,消息可能会重复发送。在第二次重新传送消息的时候,消息

只有在被确认之后,才认为已经被成功地消费了。消息的成功消费通常包含三个阶段:客户接收消息、客户处理消息和消息被确认。 在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。该参数有以下三个可选值:

 

Number Of Consumers  消费者 这个是消费者端的消费者数量 

Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量。可以理解为总接收数-总出队列数 
Messages Enqueued 进入队列的消息  进入队列的总数量,包括出队列的。 这个数量只增不减 
Messages Dequeued 出了队列的消息  可以理解为是消费这消费掉的数量 

 

默认JMS默认自动签收,消费者获取到消息之后,不管消费者对该消息处理业务逻辑是否成功,都会默认已经消费的。

手动签收模式,消息中间件将消息推送给消费者,消费者接收到消息之后,必须手动发送命令告诉消息中间件已经消费成功

当消息被消费了,消息中间件依然还存在着呢

 

需要调用:

textMessage.acknowledge();//手动签收

手动签收

 

生产者依然:  Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);    //自动签收

但是消费者 :Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);  //手动签收

  textMessage.acknowledge();  //告诉中间件 已经消费了

完整代码

package com.toov5.producer;

import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;


public class producerTest {
    // mq通讯地址
    private static String url = "tcp://192.168.91.6:61616";
    // 队列名称
    private static String queueName = "toov5_queue";

    public static void main(String[] args) throws JMSException {
        // 先创建连接工厂 密码默认采用admin admin
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(url);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 启动连接
        connection.start();
        // 创建会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 是否需要事务方式提交 消费方式默认自动签收
        // 拿到session 创建目标 创建队列
        Queue queue = session.createQueue(queueName);
        // 创建生产者
        MessageProducer producer = session.createProducer(queue); // 生产者生产的消息 是放在这个queue里面的
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);  //默认非持久化的 设置持久化
        for (int i = 0; i < 10; i++) {
            // 拿到队列 创建消息
            TextMessage textMessage = session.createTextMessage("消息内容" + i);
            // 发送消息
            producer.send(textMessage);
        }
        // 关闭连接
        connection.close();
        System.out.println("消息发送完毕");
    }

}
package com.toov5.producer;

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;


public class consumerTest {
    // mq通讯地址
    private static String url = "tcp://192.168.91.6:61616";
    // 队列名称
    private static String queueName = "toov5_queue";

    public static void main(String[] args) throws JMSException {
        // 先创建连接工厂 密码默认采用admin admin
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(url);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 启动连接
        connection.start();
        // 创建会话
        Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE); // 是否需要事务方式提交 消费方式默认自动签收
        // 拿到session 创建目标 创建队列
        Queue queue = session.createQueue(queueName);
        
        
         
        //创建消费者
        MessageConsumer consumer = session.createConsumer(queue);
        //启动监听 监听消息
        consumer.setMessageListener(new MessageListener() {
            
            public void onMessage(Message message) {
                //强制转换
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("consumer 消费 producer:"+textMessage.getText());
                    textMessage.acknowledge();  //告诉中间件 已经消费了
                } catch (JMSException e) {
                    
                    e.printStackTrace();
                }
            }
        });
         //监听时候 不要关闭连接 关闭就不监听了 一只处于监听状态 (长连接)
         
    }

}

 

以事务形式发送或者签收 (要不中间件是没有这些消息的)

producer:

package com.toov5.producer;

import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;


public class producerTest {
    // mq通讯地址
    private static String url = "tcp://192.168.91.6:61616";
    // 队列名称
    private static String queueName = "toov5_queue";

    public static void main(String[] args) throws JMSException {
        // 先创建连接工厂 密码默认采用admin admin
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(url);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 启动连接
        connection.start();
        // 创建会话
        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); // 以事务方式提交 消费方式默认自动签收
        // 拿到session 创建目标 创建队列
        Queue queue = session.createQueue(queueName);
        // 创建生产者
        MessageProducer producer = session.createProducer(queue); // 生产者生产的消息 是放在这个queue里面的
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);  //默认非持久化的 设置持久化
        for (int i = 0; i < 10; i++) {
            // 拿到队列 创建消息
            TextMessage textMessage = session.createTextMessage("消息内容" + i);
            // 发送消息
            producer.send(textMessage);
            session.commit(); //提交事务
        }
        // 关闭连接
        connection.close();
        System.out.println("消息发送完毕");
    }

}

consumer

  

package com.toov5.producer;

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;


public class consumerTest {
    // mq通讯地址
    private static String url = "tcp://192.168.91.6:61616";
    // 队列名称
    private static String queueName = "toov5_queue";

    public static void main(String[] args) throws JMSException {
        // 先创建连接工厂 密码默认采用admin admin
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(url);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 启动连接
        connection.start();
        // 创建会话
        final Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); // 是否是以事务方式提交 消费方式默认自动签收 启动事务
        // 拿到session 创建目标 创建队列
        Queue queue = session.createQueue(queueName);
        
        
         
        //创建消费者
        MessageConsumer consumer = session.createConsumer(queue);
        //启动监听 监听消息
        consumer.setMessageListener(new MessageListener() {
            
            public void onMessage(Message message) {
                //强制转换
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("consumer 消费 producer:"+textMessage.getText());
//                    textMessage.acknowledge();
                    session.commit();   //提交事务
                } catch (JMSException e) {
                    
                    e.printStackTrace();
                }
            }
        });
         //监听时候 不要关闭连接 关闭就不监听了 一只处于监听状态 (长连接)
         
    }

}

 以上所用到的pom依赖

    <dependencies>
		<dependency>
			<groupId>org.apache.activemq</groupId>
			<artifactId>activemq-core</artifactId>
			<version>5.7.0</version>
		</dependency>
     </dependencies>

  

如果生产者事务形式提交消息,消费者以事务形式接受消息

消费者 第一次运行, 但是没有标记已消费

            第二次运行,如果生产者有先的消息继续发送,消费者接收每个消息都commit,标记为已消费。  (自己试玩玩把)

 

 手动签收比较推荐下哈~

 

STM32L452与FPGA通信翻车?手把手教你关闭I2C时钟延展避坑(附OVR错误解决方案) 本文深入解析STM32L452与FPGA在I2C通信中因时钟延展功能导致的常见问题,提供关闭I2C时钟延展的详细配置方法(NOSTRETCH模式),并针对可能出现的OVR错误给出Combined模式解决方案。通过实战案例和波形分析,帮助工程师快速排查和解决嵌入式系统中的I2C兼容性问题。 阅读详情

相关推荐

从PX4的FRD到Mavros的FLU:手把手教你正确配置`setpoint_raw/local`话题发布无人机目标点

本文详细解析了PX4的FRD与Mavros的FLU坐标系转换问题,手把手教你正确配置`setpoint_raw/local`话题发布无人机目标点。通过实战指南和常见错误排查,帮助开发者避免方向错乱问题,提升无人机控制精度。

weixin_33712987的博客 422

ActiveMQ(消息中间件)学习笔记 (二)

一、JMS是什么 什么是Java消息服务? Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持Java应用程序开发。在JavaEE中,当两个应用程序使用JMS进行通信时,它们之间不是直接相连的,而是通过一个共同的消息收发服务组件关联起来以达到解耦/异步削峰的效果。 二、消息头 常用api: 消息的生产者可以set这些属性,消息的消费者可以get这些属性。 这些属性在send方法里面也可以设置.

m0_47419463的博客 193

银河飞腾FT6678实战指南:OpenMP多核并行编程优化技巧

本文详细介绍了在银河飞腾FT6678多核处理器上使用OpenMP进行并行编程的实战技巧与优化方法。从基础语法到环境配置,再到性能优化的五大核心技巧,包括循环并行化、并行粒度控制、reduction子句使用等,帮助开发者充分发挥FT6678的8核计算能力。通过实际案例展示如何将图像处理算法从200ms优化到28ms,并深入探讨了任务调度、内存访问优化等进阶主题。

weixin_29234423的博客 287

消息队列常见的 5 个应用场景

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构。使用较多的消息队列有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ。 消息队列应用场景 以下介绍消息队列在实际应用中常用的使用场景:异步处理,应用解耦,流量削锋和消息通讯四个场景。 1、异步处理 场景说明:用户注册后,需要发注...

weixin_34355715的博客 211

关于Nuttx操作系统

NuttX是一个成熟的实时操作系统

qq_28576837的博客 4092

告别理论!手把手教你用Patran/Nastran搞定悬臂翼的颤振分析(附完整模型文件)

本文提供了一份详细的Patran/Nastran悬臂翼颤振分析实战指南,涵盖从几何建模到结果解读的全过程。通过手把手教学和完整模型文件,帮助工程师和学生快速掌握气动弹性分析技术,特别适合需要实际操作的初学者。文章重点介绍了模态分析、气动建模和颤振求解等关键步骤,并提供了常见问题排查和优化建议。

weixin_30879169的博客 493

Activemq的消息签收

消息确认机制 JMS消息只有在被确认之后,才认为已经被成功地消费了。消息的成功消费通常包含三个阶段:客户接收消息、客户处理消息和消息被确认。在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。该参数有以下三个可选值: 值 描述 Session.AUTO_ACKNOWLE...

qq_29860591的博客 1102

硬件开发实践:高速 PCB 差分信号与时钟同步优化

由两条互补信号线组成(正负极)接收端只关注两线之间电压差共模噪声对两线同时作用,可被抵消。

2501_93174775的博客 394

ActiveMQ签收_10

事务主要是偏向生产者,签收主要是偏向消费者。 再来看签收参数,之前我们设置的是Session.AUTO_ACKNOWLEDGE,也就是自动签收,可以理解为快递员自动给你签收了并放到了快递柜中。当然还有手动签收,也就是见到快递员,开箱验货,再签收的意思。 自动签收(默认):Session.AUTO_ACKNOWLEDGE。 手动签收:Session.CLIENT_ACKNOWLEDGE,客户端调用acknowledge()方法手动签收,如果忘记了写acknowledge()方法,下次再启动的时候,就会重

Be_nurturing的博客 437

YOLOv10涨点改进:SPPF原创自研创新 | SPPF创新结构,重新设计全局平均池化层和全局最大池化层,增强全局视角信息和不同尺度大小的特征

SPPF原创自研创新

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 2086

OceanBase数据迁移(OMS)深度解析:异构数据库迁移方案、核心原理与实战优化指南

OceanBase迁移服务(OMS)提供异构数据库间全量+增量数据迁移与实时同步能力,核心价值在于保障业务连续性、数据一致性和异构兼容性。其分层架构包含服务接入层、流程编排层和组件链路层,支持Oracle/MySQL/DB2等与OceanBase的数据交互。关键技术包括DBCat引擎处理结构转换、并行分片实现全量迁移、以及日志解析保障增量同步。OMS通过类型映射、批量提交和断点续传等优化手段,确保迁移过程高效可靠,典型应用于去O迁移、数据库升级等场景。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 849

什么是JMS(消息服务)

JMS的定义 JMS的组成 JMS provider 实现JMS接口和规范的消息中间件,也就是我们的MQ服务。 JMS producer 消息生产者,创建和发送JMS消息的客户端应用。 JMS consumer 消息消费者,接收和处理JMS消息的客户端应用。 JMS message 消息头 消息头有7个属性,分别是JMSDestination、JMSDeliveryMode、JMSExpiration 、JMSPriority、JMSMessageID。 JMSDestination:消息发送的目的地,主要

wsb_2526的博客 5962

Windows版,vcenter 6.0 STS 证书更新--Vcenter 6.0 windows 版,没有-set_signing_cert 替换参数

Windows版,vcenter 6.0 STS 证书手动更新

技术是手段,服务才是目的。开源与协作是创新的活水,而核心技术的自主可控是立足之本。身处黄金时代,唯持续学习,方能不惧变化。从使用者到创造者,中国技术的未来,正待你们接过火炬,走得更远、更稳、更好。 675

JMS 的消息可靠性机制

消息传输在两个环节上进行:第一个环节是生产者发送消息到队列;第二个环节是消费者从队列获得消息。因此,在下面的三个阶段可能会使消息丢失:在生产者发送消息到代理的时候;当代理发生故障时在代理内存中的时候;在消费者从代理节点获取消息的时候;由于当代理发生故障时非持久性消息总是会丢失,因此可靠传输仅适用于持久性消息。可靠传递机制可保证传输过程在上述任一阶段都不会失败。消息的可靠性传递使用了两种机制来确保可...

z123456789XDW的博客 602

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JMS消息的可靠性机制

1.消息接收确认 JMS消息在只有被确认之后,才认为是已经被成功的消费了。消息的成功消费通常包含三个阶段:客户接收消息、客户处理消息、消息被确认。 在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于消息创建会话时的应答模式(acknowledgement mode)。该参数有以下三个可选值: Session...

weixin_30691871的博客 170

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

在 JMS(Java Message Service)里,事务与确认机制是保证消息可靠传递和处理的关键

队列:适用于需要确保消息只被处理一次的场景,如任务分配、订单处理等。主题:适用于需要将消息广播给多个消费者的场景,如事件通知、监控上报等。通过理解队列和主题的区别,可以更好地选择适合业务需求的消息模型,实现高效、可靠的消息传递和处理。

[Blog][Domain] programb.blog.youkuaiyun.com 1580

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

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

一篇文章理解JMS

JMSJMS是什么 JMS Java Message Service Java消息服务。是JAVA EE中的一个技术,JMS定义了JAVA中访问消息中间件的接口。类似JDBC。定义了接口,并不具体实现。实现JMS接口消息的中间件称为JMS Provider.例如:ActiveMQ. JMS基本概念JMS Message JMS Message JMS消息,JMS消息由三部分组成 1.消息头:每个消

永不止步 550

ActiveMQ学习笔记2-JMS可靠机制

1. 确认 JMS消息只有在被确认之后,才认为已经被成功地消费了。消息的成功消费通常包含三个阶段:客户接收消息、客户处理消息和消息被确认。 在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。该参数有以下三个可选值: 1) Session.AUTO_ACKNOWLEDGE。当客户成功的从rec......

代码让AI扣 340

activeMQ详解一 activeMQ和JMS规范

一、activeMQ是什么? ActiveMQ 是完全基于 JMS 规范实现的一个消息中间件产品。是 Apache 开源基金会研发的消息中间件。ActiveMQ主要应用在分布式系统架构中,帮助构建高可用、高性能、可伸缩的企业级面向消息服务的系统 ActiveMQ 特性: 1)多语言和协议编写客户端 语言:java/C/C++/C#/Ruby/Perl/Python/PHP 协议 :openwire...

zhangxm_qz的博客 890

消息中间件之ActiveMQ原理及使用教程(持久化、JMS可靠消息、重试机制与幂等性问题)

消息中间件产生的背景 1、在客户端与服务器进行通讯时,客户端调用后,必须等待服务对象完成处理返回结果才能继续执行,这个过程是基于请求与响应的同步过程。 2、客户与服务器对象的生命周期紧密耦合,客户进程和服务对象进程都都必须正常运行;如果由于服务对象崩溃或者网络故障导致用户的请求不可达,客户会受到异常。 3、点对点通信: 客户的一次调用只发送给某个单独的目标对象。   同步除了可能会产生阻...

zp的博客 5256

创建强健,稳定的 JMS 系统

The most reliable way to produce a message is to send a PERSISTENT message within a transaction. JMS messages are PERSISTENT by default. A transaction is a unit of work into which you can group a seri...

Be a man 299

ActiveMQ事务性消息

事务性消息是指在消息传递过程中,发送和接收消息的一系列操作要么全部成功,要么全部失败。在ActiveMQ中,事务性消息通过使用JMS事务机制来实现。JMS事务机制可以确保消息的可靠传递,并提供了消息处理的原子性和一致性。在ActiveMQ中,可以通过设置事务相关的参数来使用事务性消息。下面是一些常用的参数介绍:javax.jms.Session:JMS会话对象,用于发送和接收消息。Session.beginTransaction():开启一个事务。Session.commit():提交事务。

互联网知识分享 535

ActiveMQ 01 消息中间件jmsMQ

消息中间件之ActiveMQ

Jack方 1250

一起来学activeMQ 3.JMS 的可靠性机制

JMS的可靠机制主要表现在 消息的消费!但是我希望从消息的生产开始说起!生产者消息的生产发送可靠性通过session来维持再创建session时我们可以选择事物或非事物 1.值得注意的是,单我们处于生产者时,无论我们选择事物,还是非事物,另一个参数(acknowledgeMode)都毫无意义! 2.当我们选择事物的时候, acknowledgeMode没有意义可以下瞎写, 此时当我们sessi

helloMyWorlds的博客 801

【消息】消息事务机制

在消息事务机制中,发送方和接收方可以通过事务管理器来协调消息的传递和处理。发送方发送消息时,将消息放入一个事务中,事务管理器负责确保消息被正确传递给接收方。消息事务机制是指在消息传递系统中,保障消息的可靠性传递和一致性处理的机制。在分布式系统中,消息通常是异步发送和接收的,这意味着发送方无法立即知道消息是否成功传递给接收方。如果发送方在发送消息后发生故障或网络出现问题,事务管理器可以将消息标记为未发送状态,并在后续恢复时重新发送。消息事务机制可以确保消息的可靠传递和处理,降低消息丢失和重复处理的风险。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 478

JMS的可靠性机制

确认: JMS消息只有在被确认之后,才认为已经被成功地消费了。消息的成功消费通常包含三个阶段:客户接收消息,客户处理消息,消息被确认。 在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话中, 消息何时被确认取决于创建会话时的应答模式 (acknowledgement mode) 。 该参数有以下三个可选值: 1.Session.AUTO_ACKNOWLEDGE

qq_21336789的博客 289
上一篇: ActiveMQ之发布、订阅使用
下一篇: ActiveMQ持久化机制
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值