简述网站建设的基本过程,网站备案 备注关联性,视频搜索引擎网站开发方法,百度推广代理商与总公司的区别这篇文章#xff0c;主要接收消息队列RabbitMQ七种模式之Publisher Confirms发布确认模式。 目录 
一、消息队列 
1.1、发布确认模式 
1.2、案例代码 
#xff08;1#xff09;引入依赖 
#xff08;2#xff09;编写生产者【消息确认--单条确认】 
#xff08;3#xf… 这篇文章主要接收消息队列RabbitMQ七种模式之Publisher Confirms发布确认模式。 目录 
一、消息队列 
1.1、发布确认模式 
1.2、案例代码 
1引入依赖 
2编写生产者【消息确认--单条确认】 
3编写生产者【消息确认--批量确认】 
4编写生产者【消息确认--异步确认】 一、消息队列 
1.1、发布确认模式 
RabbitMQ消息队列中生产者发送消息给RabbitMQ的时候可能会出现发送失败的情况如果不进行处理此时这一条消息就将丢失。如何确保生产者一定能够将消息发送到RabbitMQ里面呢 
RabbitMQ提出了一种发布确认模式这种模式大致思想是生产者发送消息给RabbitMQ时候如果RabbitMQ正确接收到消息后需要发给一个ACK标识给生产者生产者接收到ACK标记后就可以确认这一条消息发送成功啦。如果生产者没有接收到ACK标识则可以重复发送这一条消息给RabbitMQ这就可以确保消息不丢失。 发布确认模式有三种实现分别是逐条确认机制、批量确认机制、异步确认机制。 
1.2、案例代码 
1引入依赖 
!-- 引入 RabbitMQ 依赖 --
dependencygroupIdcom.rabbitmq/groupIdartifactIdamqp-client/artifactIdversion5.16.0/version
/dependency 
2编写生产者【消息确认--单条确认】 
生产者发送消息的时候需要调用【confirmSelect()】方法开启消息确认机制。生产者将消息发送完成之后需要调用【waitForConfirms()】方法阻塞等待RabbitMQ消息队列返回ACK标识。这个方法返回一个boolean类型true表示RabbitMQ接收消息成功false表示接收失败。【waitForConfirms()】方法还可以指定一个超时时间如果在这个超时时间里面RabbitMQ还没有返回ACK标识那么该方法将抛出一个InterruptedException中断异常。
package com.rabbitmq.demo.confirm;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;/*** version 1.0.0* Date: 2023/2/25 16:23* Copyright (C) ZhuYouBin* Description: 消息生产者*/
public class Producer {public static void main(String[] args) {// 1、创建连接工厂ConnectionFactory factory  new ConnectionFactory();// 2、设置连接的 RabbitMQ 服务地址factory.setHost(127.0.0.1); // 默认就是本机factory.setPort(5672); // 默认就是 5672 端口// 3、获取连接Connection connection  null; // 连接Channel channel  null; // 通道try {connection  factory.newConnection();// 4、获取通道channel  connection.createChannel();// TODO 开启消息确认机制channel.confirmSelect();// 5、声明 Exchange如果不存在则会创建String exchangeName  exchange_direct_2023;channel.exchangeDeclare(exchangeName, direct);// 6、发送消息for (int i  0; i  10; i) {// 路由键唯一标识String routingKey  error;if (i % 3  0) {routingKey  info;} else if (i % 3  1) {routingKey  warn;}String message  这是发布确认模式发送的第【  (i1)  】条【  routingKey  】消息数据;channel.basicPublish(exchangeName, routingKey, null, message.getBytes());// 等待RabbitMQ返回ACK标识boolean wait  channel.waitForConfirms();System.out.println(RabbitMQ是否接收成功:   wait);if (!wait) {// 消息发送失败则可以重新发送channel.basicPublish(exchangeName, routingKey, null, message.getBytes());}}} catch (Exception e) {e.printStackTrace();} finally {if (null ! channel) {try {channel.close();} catch (Exception e) {}}if (null ! connection) {try {connection.close();} catch (Exception e) {}}}}
}3编写生产者【消息确认--批量确认】 
前一种方式是一条消息就调用一次【waitForConfirms()】方法阻塞等待RabbitMQ的ACK确认标识。但是这种方式是非常耗时的当需要发送的消息非常多的时候会严重影响系统性能所以为了解决这个问题提出了批量确认的方法。批量确认调用【waitForConfirmsOrDie()】方法此时会等待一批消息的ACK确认标识如果这一批消息中存在一个消息没有被RabbitMQ成功接收此时该方法将抛出一个【IOException】异常。所以可以通过捕获IOException异常来判断消息是否发送成功。这种方式的缺点当一批消息出现失败的情况时候我们没办法知道是哪一条消息失败了只能够重新将这一批消息重新发送。
package com.rabbitmq.demo.confirm;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;/*** version 1.0.0* Date: 2023/2/25 16:23* Copyright (C) ZhuYouBin* Description: 消息生产者*/
public class ProducerBatch {public static void main(String[] args) {// 1、创建连接工厂ConnectionFactory factory  new ConnectionFactory();// 2、设置连接的 RabbitMQ 服务地址factory.setHost(127.0.0.1); // 默认就是本机factory.setPort(5672); // 默认就是 5672 端口// 3、获取连接Connection connection  null; // 连接Channel channel  null; // 通道try {connection  factory.newConnection();// 4、获取通道channel  connection.createChannel();// TODO 开启消息确认机制channel.confirmSelect();// 5、声明 Exchange如果不存在则会创建String exchangeName  exchange_direct_2023;channel.exchangeDeclare(exchangeName, direct);// 6、发送消息int batchSize  3;int count  0;for (int i  0; i  10; i) {// 路由键唯一标识String routingKey  error;if (i % 3  0) {routingKey  info;} else if (i % 3  1) {routingKey  warn;}String message  这是发布确认模式发送的第【  (i1)  】条【  routingKey  】消息数据;channel.basicPublish(exchangeName, routingKey, null, message.getBytes());// 批量确认if (count  batchSize) {// 等待RabbitMQ返回ACK标识channel.waitForConfirmsOrDie();count  0;}count;}} catch (IOException e) {System.out.println(消息发送失败啦);} catch (Exception e) {e.printStackTrace();} finally {if (null ! channel) {try {channel.close();} catch (Exception e) {}}if (null ! connection) {try {connection.close();} catch (Exception e) {}}}}
}4编写生产者【消息确认--异步确认】 
异步确认在消息发送之后调用【addConfirmListener()】方法该方法介绍两个参数第一个参数是成功接收到ACK标识的回调方法第二个参数是失败接收到NACK标识的回调方法。注意一定要先调用【addConfirmListener()】监听方法然后再发送消息如果两者顺序反了则监听方法不生效。
package com.rabbitmq.demo.confirm;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmCallback;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;/*** version 1.0.0* Date: 2023/2/25 16:23* Copyright (C) ZhuYouBin* Description: 消息生产者*/
public class ProducerAsync {public static void main(String[] args) {// 1、创建连接工厂ConnectionFactory factory  new ConnectionFactory();// 2、设置连接的 RabbitMQ 服务地址factory.setHost(127.0.0.1); // 默认就是本机factory.setPort(5672); // 默认就是 5672 端口// 3、获取连接Connection connection  null; // 连接Channel channel  null; // 通道try {connection  factory.newConnection();// 4、获取通道channel  connection.createChannel();// TODO 开启消息确认机制channel.confirmSelect();// 5、声明 Exchange如果不存在则会创建String exchangeName  exchange_confirm_2023;channel.exchangeDeclare(exchangeName, direct);// TODO 一定要先调用监听接口在发送消息channel.addConfirmListener(new ConfirmCallback() {Overridepublic void handle(long deliveryTag, boolean multiple) throws IOException {System.out.println(RabbitMQ接收成功啦.....消息的标识deliveryTag  deliveryTag  ,批量发送多条消息multiple  multiple);}}, new ConfirmCallback() {Overridepublic void handle(long deliveryTag, boolean multiple) throws IOException {System.out.println(RabbitMQ接收失败啦.....);}});for (int i  0; i  10; i) {// 6、发送消息String message  这是发布确认模式发送的消息数据;channel.basicPublish(exchangeName, queue_confirm_2023, null, message.getBytes());}} catch (IOException e) {System.out.println(消息发送失败啦);} catch (Exception e) {e.printStackTrace();} finally {if (null ! channel) {try {channel.close();} catch (Exception e) {}}if (null ! connection) {try {connection.close();} catch (Exception e) {}}}}
}到此RabbitMQ消息队列中的发布确认模式就介绍完啦。 综上这篇文章结束了主要接收消息队列RabbitMQ七种模式之Publisher Confirms发布确认模式。 
 文章转载自: http://www.morning.tbzcl.cn.gov.cn.tbzcl.cn http://www.morning.grryh.cn.gov.cn.grryh.cn http://www.morning.mfzyn.cn.gov.cn.mfzyn.cn http://www.morning.gbqgr.cn.gov.cn.gbqgr.cn http://www.morning.gqfks.cn.gov.cn.gqfks.cn http://www.morning.rhkgz.cn.gov.cn.rhkgz.cn http://www.morning.cwwts.cn.gov.cn.cwwts.cn http://www.morning.jynzb.cn.gov.cn.jynzb.cn http://www.morning.brzlp.cn.gov.cn.brzlp.cn http://www.morning.qtzk.cn.gov.cn.qtzk.cn http://www.morning.fwdln.cn.gov.cn.fwdln.cn http://www.morning.krkwh.cn.gov.cn.krkwh.cn http://www.morning.lhrcr.cn.gov.cn.lhrcr.cn http://www.morning.dzqr.cn.gov.cn.dzqr.cn http://www.morning.grbgn.cn.gov.cn.grbgn.cn http://www.morning.srbfp.cn.gov.cn.srbfp.cn http://www.morning.rnnts.cn.gov.cn.rnnts.cn http://www.morning.pttrs.cn.gov.cn.pttrs.cn http://www.morning.xsfny.cn.gov.cn.xsfny.cn http://www.morning.wmhqd.cn.gov.cn.wmhqd.cn http://www.morning.dpbdq.cn.gov.cn.dpbdq.cn http://www.morning.hprmg.cn.gov.cn.hprmg.cn http://www.morning.wqmyh.cn.gov.cn.wqmyh.cn http://www.morning.mqfhy.cn.gov.cn.mqfhy.cn http://www.morning.mmqng.cn.gov.cn.mmqng.cn http://www.morning.gfrtg.com.gov.cn.gfrtg.com http://www.morning.sdecsd.cn.gov.cn.sdecsd.cn http://www.morning.junyaod.com.gov.cn.junyaod.com http://www.morning.bfjtp.cn.gov.cn.bfjtp.cn http://www.morning.bzqnp.cn.gov.cn.bzqnp.cn http://www.morning.bkgfp.cn.gov.cn.bkgfp.cn http://www.morning.0small.cn.gov.cn.0small.cn http://www.morning.bpmdx.cn.gov.cn.bpmdx.cn http://www.morning.rljr.cn.gov.cn.rljr.cn http://www.morning.rfwrn.cn.gov.cn.rfwrn.cn http://www.morning.dndjx.cn.gov.cn.dndjx.cn http://www.morning.pwgzh.cn.gov.cn.pwgzh.cn http://www.morning.bsqth.cn.gov.cn.bsqth.cn http://www.morning.rjrh.cn.gov.cn.rjrh.cn http://www.morning.skrww.cn.gov.cn.skrww.cn http://www.morning.zbgqt.cn.gov.cn.zbgqt.cn http://www.morning.dmfdl.cn.gov.cn.dmfdl.cn http://www.morning.rptdz.cn.gov.cn.rptdz.cn http://www.morning.rfrx.cn.gov.cn.rfrx.cn http://www.morning.xpzrx.cn.gov.cn.xpzrx.cn http://www.morning.banzou2034.cn.gov.cn.banzou2034.cn http://www.morning.ztnmc.cn.gov.cn.ztnmc.cn http://www.morning.kwqqs.cn.gov.cn.kwqqs.cn http://www.morning.ypqwm.cn.gov.cn.ypqwm.cn http://www.morning.lddpj.cn.gov.cn.lddpj.cn http://www.morning.ztmnr.cn.gov.cn.ztmnr.cn http://www.morning.cwyfs.cn.gov.cn.cwyfs.cn http://www.morning.qrlkt.cn.gov.cn.qrlkt.cn http://www.morning.pqrhb.cn.gov.cn.pqrhb.cn http://www.morning.dqpd.cn.gov.cn.dqpd.cn http://www.morning.bhgnj.cn.gov.cn.bhgnj.cn http://www.morning.xyjlh.cn.gov.cn.xyjlh.cn http://www.morning.pbtrx.cn.gov.cn.pbtrx.cn http://www.morning.wjlhp.cn.gov.cn.wjlhp.cn http://www.morning.rqgbd.cn.gov.cn.rqgbd.cn http://www.morning.kyflr.cn.gov.cn.kyflr.cn http://www.morning.xnpml.cn.gov.cn.xnpml.cn http://www.morning.mmsf.cn.gov.cn.mmsf.cn http://www.morning.plhyc.cn.gov.cn.plhyc.cn http://www.morning.rcjyc.cn.gov.cn.rcjyc.cn http://www.morning.dmnqh.cn.gov.cn.dmnqh.cn http://www.morning.mmplj.cn.gov.cn.mmplj.cn http://www.morning.yfrbn.cn.gov.cn.yfrbn.cn http://www.morning.dnqliv.cn.gov.cn.dnqliv.cn http://www.morning.rccbt.cn.gov.cn.rccbt.cn http://www.morning.nbwyk.cn.gov.cn.nbwyk.cn http://www.morning.ckwxs.cn.gov.cn.ckwxs.cn http://www.morning.bpmtr.cn.gov.cn.bpmtr.cn http://www.morning.phgz.cn.gov.cn.phgz.cn http://www.morning.yrnyz.cn.gov.cn.yrnyz.cn http://www.morning.qwyms.cn.gov.cn.qwyms.cn http://www.morning.lmpfk.cn.gov.cn.lmpfk.cn http://www.morning.hqrkq.cn.gov.cn.hqrkq.cn http://www.morning.trjp.cn.gov.cn.trjp.cn http://www.morning.kdrly.cn.gov.cn.kdrly.cn