java如何实现rabbitmq的消息确认机制和消息持久化机制配置和示例

在Java中,使用RabbitMQ的客户端库(通常是AMQP客户端库,如RabbitMQ的Java客户端)可以方便地实现消息确认机制和消息持久化机制。以下是如何实现这两个机制的示例。

1、消息确认机制

RabbitMQ支持两种类型的确认:生产者到交换机的确认(通常在发送时默认进行)和消费者到队列的确认。在Java中,消费者确认通常通过手动确认消息来实现。

1、生产者示例

import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Channel;public class Producer {private final static String QUEUE_NAME = "my_queue";public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = "Hello World!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + message + "'");}}
}

2、消费者示例(使用手动确认)

import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Consumer {private final static String QUEUE_NAME = "my_queue";public static void main(String[] argv) throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");// 手动确认消息try {channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);} catch (IOException e) {e.printStackTrace();}};channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> { });}
}

在上面的消费者示例中,basicConsume方法的第二个参数设置为false,表示消息不会自动确认。当消息被处理完成后,调用basicAck方法来手动确认消息。

2、消息持久化机制

要使消息持久化,你需要确保队列、消息以及交换机都是持久化的。

1、持久化队列和消息示例

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class DurableProducer {private final static String QUEUE_NAME = "my_durable_queue";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明一个持久化队列channel.queueDeclare(QUEUE_NAME, true, false, false, null);String message = "Hello World!";// 设置消息的属性为持久化BasicProperties properties = new BasicProperties.Builder().deliveryMode(2) // 设置为2表示消息是持久化的.build();channel.basicPublish("", QUEUE_NAME, properties, message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + message + "'");}}
}

在上面的生产者示例中,queueDeclare方法的第二个参数设置为true来创建持久化队列,而BasicProperties的deliveryMode设置为2来标记消息为持久化。

2、交换机持久化

对于交换机,如果你使用的是默认的直连交换机,那么它不需要特别声明为持久化的,因为直连交换机在RabbitMQ中是内置的,并且总是存在的。然而,如果你使用的是自定义的交换机类型(如topic或headers),并且想要它们持久化,那么需要在声明交换机时设置durable参数为true。

确保RabbitMQ服务器已配置为在重启时保留持久化数据(这通常是默认配置,但可能因安装和配置方式而异)。

请注意,持久化虽然提高了可靠性,但可能会降低性能,因为磁盘I/O操作通常比内存操作慢。因此,在设计系统时,应根据业务需求权衡可靠性与性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python编程小例子—石头、剪子、布游戏

random库的应用—石头、剪子、布游戏 Random标准库的用法 在Python中,random是一个标准库,提供了生成随机数的功能。以下是一些常见用法: 生成随机整数: import random# 生成指定范围内的随机整数 random_int random.randint(1, 100)生成…

HiveSql中的函数家族(二)

一、窗口函数 1、什么是窗口函数 在 SQL 中,窗口函数(Window Functions)是一种特殊的函数,它允许在查询结果集的特定窗口(通常是一组行)上执行聚合、分析和计算操作,而无需聚合整个结果集。窗口…

FTP客户端Transmit 5 for Mac中文激活版

Transmit 5是一款功能强大的Mac FTP客户端软件,它由Panic公司开发,为用户提供简单、高效的文件传输体验。 Transmit 5 for Mac中文激活版下载 Transmit 5支持多种传输协议,如FTP、SFTP、WebDAV和Amazon S3等,满足用户不同的文件传…

【公司UI自动化学习】

公司课程链接:https://l.jd.com/student/project/project.du?project_id697509403 公司的课程,是给一个学习方向。 一、 PC自动化 1)什么项目适合 2)PC自动化介入时间点 3)自动化率: 频繁改动的&…

不需要GPU就可以玩转模型,同时支持本地化部署

简单一款不需要GPU就可以在Win 机器跑的模型:Ollama;用于本地运行和部署大型语言模型(LLMs)的开源工具 关于Ollama的简要介绍 平台兼容性:Ollama支持多种操作系统,包括macOS、Linux和Windows,…

华为手机无法弹出wifi上网认证页面处理

华为手机无法弹出wifi上网认证页面 连wifi后跳到上图界面卡住,不跳转到单位的上网认证界面。 打开手机的设置应用,点击上面的WLAN选项。 点击上面的更多WLAN设置选项。 关闭WLAN安全检测就可以正常弹出上网认证界面, 正常弹出上网认证界面&a…

C++类和对象 中(六大默认成员函数)

前言 紧接着上一篇文章,接下来我们来认识下类的六大默认成员函数,如下图。之所以叫他默认成员函数,是因为即使我们不写,编译器会默认帮我们写,但只要我们自己显示的写了,编译器就不会帮我们生成对应的成员函…

H3C交换机FTP与TFTP

一、设备作为服务器端 服务器端配置:首先保证服务器和客户端网络联通,开启 FTP 服务,配置访问 FTP 服务器的账号密码权限。 system-view # 登录系统界面 intg1/0/1 …

windows平台编译OpenCV以支持CUDA

一、环境要求 VS 2022社区版点击这里CMake(个人是GUI版本)点击这里OpenCV源码点击这里Opencv-contrib源码点击这里CUDA CUDNN参考这篇文章 个人的工具使用版本工具版本说明vs2019 社区版

第十五届蓝桥杯复盘python大学A组——试题C 数字诗意

思路 数字可以分为 有诗意的数字可以写成 (ij)(j-i1)/2 ( i、j都是正整数 ) ij 、j-i1 的奇偶性不同(因为i、j都是正整数) 因此, 如果一个数是奇数就一定有诗意 eg.312 ,523,734,945… 原因:根据上述分…

114 接口中幂等性的保证

前言 同样是 面试问题 如何确保接口的 幂等性 幂等是一个 较为抽象的概念, 多次重复访问, 不会导致业务逻辑的异常 这里从增删改查, 几个方面列一下 一般来说, 我们核心需要关注的就是 新增 和 更新 对于 增加元素, 首先针对唯一约束进行校验, 然后再处理新增的相关业…

Day09 React———— 第九天

ReactRoter 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候,path 对应的组件会在页面中进行渲染 基础用法 import { createBrowserRouter, RouterProvider } from "react-router-dom"; const router createBrowserRoute…

基于windowns下的TCP网络通信编程

Tcp通信的三次握手和四次挥手 TCP的三次握手和四次挥手是TCP连接的建立和断开过程,确保了可靠的数据传输和连接状态的正确管理。 TCP的三次握手(TCP 链接建立): 1. 客户端发送 SYN : 客户端向服务器发送一个 SYN 报文…

AI讲师人工智能讲师大模型培训讲师叶梓:突破大型语言模型推理效率的创新方法

大型语言模型(LLM)在自然语言处理(NLP)任务中展现出了前所未有的能力,但它们对计算资源的巨大需求限制了其在资源受限环境中的应用。SparQ Attention算法提出了一种创新的方法,通过减少注意力机制中的内存带…

TCP为什么需要3次握手?

一、3次握手过程 客户端向服务端发送一个表示建立连接的SYN报文段,服务端从IP数据报中提取出TCP SYN报文段,为该TCP连接分配需要的缓存和变量,并向客户端发送表示允许连接的报文段ACK。客户端在收到ACK报文段之后,也要给该连接分配…

探索Java世界中的七大排序算法(上)

文章目录 排序的概念直接插入排序希尔排序( 缩小增量排序)选择排序堆排序冒泡排序 在计算机科学中,排序算法是一类重要的算法,它们用于将一组元素按照一定的顺序进行排列。在Java编程中,我们经常需要对数组或集合进行排序操作。本文将介绍Jav…

【docker 】docker-compose 部署mongoDB

在notepad中将格式改为UNIX (编辑》文档格式转化》转为Unix),编码改为UTF-8 ( 编码》转为UTF-8),改好后如图 新建启动脚本 mongo.sh #!/bin/bash # 挂载路径 DATA_DIR/opt/docker-data/mongodb/data LOG_…

timesten 安装

1. 安装 从oracle的网站(http://www.oracle.com/technology/global/cn/software/products/timesten/index.html)下载,timesten的安装文件。 将下载文件解压后,出现linux86文件夹,执行setup.sh,步骤如下…

死磕GMSSL通信-java/Netty系列(三)

死磕GMSSL通信-java/Netty系列(三) 接着上次的博客继续完善,上次其实只是客户端的改造,这次把服务端的也补上,netty集成GMSSL实现GMServer 1、netty_tcnative c代码改造,这个是客户端和服务端都需要都该的…

数据挖掘与机器学习

一. 机器学习的种类 1. 有监督的机器学习 : 分类 : KNN 最近邻 逻辑回归 - 朴素贝叶斯估计 SVM 线性 或 非线性 优化模型 决策树模型 - 随机森林 - 其它集成模型 lightGBM - XGBOOST 回归: 线性 …