RabbitMQ confirm的确认监听模式

添加确认监听需要开启确认监听模式 实现 addConfirmListener方法confirm模式最大的好处在于他是异步的,一旦发布一条消息,生产者应用程序就可以在等信道返回确认的同时继续发送下一条消息,当消息最终得到确认之后,生产者应用便可以通过回调方法来处理该确认消息,如果RabbitMQ因为自身内部错误导致消息丢失,就会发送一条nack消息,生产者应用程序同样可以在回调方法中处理该nack消息;

消费者:
package com.flying.rabbitmq.api.confirm;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;

public class Consumer {

    public static void main(String[] args) throws Exception {

        //1 创建ConnectionFactory
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/");

        //2 获取Connection
        Connection connection = connectionFactory.newConnection();

        //3 通过Connection创建一个新的Channel
        Channel channel = connection.createChannel();

        String exchangeName = "test_confirm_exchange";
        String routingKey = "confirm.#";
        String queueName = "test_confirm_queue";

        //4 声明交换机和队列 然后进行绑定设置, 最后制定路由Key
        channel.exchangeDeclare(exchangeName, "topic", true);
        channel.queueDeclare(queueName, true, false, false, null);
        channel.queueBind(queueName, exchangeName, routingKey);

        //5 创建消费者
        QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
        channel.basicConsume(queueName, true, queueingConsumer);

        while(true){
            Delivery delivery = queueingConsumer.nextDelivery();
            String msg = new String(delivery.getBody());

            System.err.println("消费端: " + msg);
        }

    }
}

生产者:

package com.flying.rabbitmq.api.confirm;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmListener;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;

/**
 * 添加确认监听需要开启确认监听模式 实现 addConfirmListener方法
 * confirm模式最大的好处在于他是异步的,一旦发布一条消息,
 * 生产者应用程序就可以在等信道返回确认的同时继续发送下一条消息,
 * 当消息最终得到确认之后,生产者应用便可以通过回调方法来处理该确认消息,
 * 如果RabbitMQ因为自身内部错误导致消息丢失,就会发送一条nack消息,生产者应用程序同样可以在回调方法中处理该nack消息;
 */
public class Producer {

    public static void main(String[] args) throws Exception {

        //1 创建ConnectionFactory
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/");

        //2 获取Connection
        Connection connection = connectionFactory.newConnection();

        //3 通过Connection创建一个新的Channel
        Channel channel = connection.createChannel();

        //4 指定我们的消息投递模式: 消息的确认模式
        channel.confirmSelect();
        String exchangeName = "test_confirm_exchange";
        String routingKey = "confirm.save";

        //5 发送一条消息
        String msg = "Hello RabbitMQ Send confirm message!";
        channel.basicPublish(exchangeName, routingKey, null, msg.getBytes());

        // 添加一个确认监听
        channel.addConfirmListener(new ConfirmListener() {
            @Override
            public void handleAck(long deliveryTag, boolean multiple) throws IOException {
                System.err.println(deliveryTag);
                System.err.println("-------no ack!-----------");
            }

            @Override
            public void handleNack(long deliveryTag, boolean multiple) throws IOException {

                System.err.println("-------ack!-----------");
            }
        });

    }
}

原文地址:https://www.cnblogs.com/lflying/p/11107340.html

时间: 2024-08-29 09:28:50

RabbitMQ confirm的确认监听模式的相关文章

Kali2.0在使用aircrack-ng破解无线密码时网卡监听模式问题

在使用Kali2.0 aircrack-ng破解需先密码时执行以下命令后会发现无法启用网卡的监听模式airmon-ng start wlan0执行以下命令后报错airodump-ng mon0 出现以上问题原因是因为系统本身问题,网卡并未进入监听模式 解决办法: ifconfig wlan0 down iwconfig wlan0 monitor ifconfig wlan0 up 再次执行 airmon-ng start wlan0 airodump-ng mon0 网卡进入监听模式

Aircrack-ng设置监听模式异常

Aircrack-ng设置监听模式异常 aircrack-ng 在某些情况下,用户使用Aircrack-ng工具集中的airmon-ng命令,将无线网卡设置为监听模式时,会出现异常.如SIOCSIFFLA65:Name not unique on network等.此时,用户可以尝试使用iwconfig来设置.具体设置方法如下所示: (1)关闭无线网卡.执行如下命令: ifconfig wlan0 down (2)设置监听模式.执行命令如下所示: iwconfig wlan0 mode moni

设计模式之监听模式(观察者模式与监听模式区别)

一,类的四大基本关系:  a.关联关系:如A类调用B类. b.继承关系:如A类是B类的父类. c.聚合关系:如装橘子的箱子,箱子是否存在与里面装没装橘子没有任何关系,也就是说橘子不会影响箱子的存在. d.组合关系:如一个小组,小组是否存在与小组中是否有组员是息息相关的,如果没有组员,小组就不存在了. 监听器模式:事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法 观察者模式:观察者(Observer)相当于事件监听者,被观察者(Observable)相当于

观察者模式和事件监听模式的区别

事件监听模式更像是观察者模式的进阶. 观察者模式中,'主题'会在特定逻辑下通知所有'观察者'.如果这个通知不包含任何信息,那么这种实现就是通常的观察者模式. 如果'主题'通知'观察者'的过程带有一些<其他信息>.那么'主题'本身已经上升成为了'事件源',而通知中带有的<其他信息>经过封装就成为了事件. 事件监听模式的优势:在很多应用场景中,通知中附带的<其他信息>是必不可少的,事件Event则对这些<信息>进行了封装,使它本身拥有了多态的特性.每个事件对象就

WCF-ServiceEndpoint的监听地址与监听模式

ServiceEndpoint具有一个可读可写的ListenUri属性,该属性表示服务端终结点的物理监听地址,该地址默认和终结点逻辑地址一致(即ServiceEndpoint的Uri).对于客户端来说,请求真正发送的目标地址是服务的监听地址,默认情况下终结点的逻辑地址和监听地址是一样的.监听地址可以通过ServiceHost的AddServiceEndpoint指定. public ServiceEndpoint AddServiceEndpoint(Type implementedContra

RabbitMQ消费端自定义监听(九)

场景: 我们一般在代码中编写while循环,进行consumer.nextDelivery方法进行获取下一条消息,然后进行消费处理. 实际环境: 我们使用自定义的Consumer更加的方便,解耦性更强,也在实际工作中最常用. 操作: //生产端代码 ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost("127.0.0.1"); connectionFactory

《人人都懂设计模式》-监听模式

最近在撸这本书, 作个记录. from abc import ABCMeta, abstractmethod # 引入ABCMeta和abstractmethod来定义抽象类和抽象方法 import time """ # version 1.0 class WaterHeater: # 热水器, 战胜寒冬的有利武器 def __init__(self): self.__observers = [] self.__temperature = 25 def get_tempera

监听 javascript 对象的变化

这一章话题的由来,还要从一些学员的作业说起.写这篇文章主要是想让大家能从不同的角度分析问题,学习的过程中多看,多练,多想,多查,多用心.在特别多的学习网站中大部分的学习资料基本都是循规蹈矩的,例如慕课网的 javascript 入门教程中,很多讲师都讲了一些实例,而这些例子中的代码风格如出一辙,没什么新意,而且这些教程占了很大一部分比例.在这里,给大家提供另外一种思路 ------ 监听,具体代码的实现大家自己实现.也欢迎大家评论区写出不同想法. 先给出监听的概念:监听一个对象的某个属性是否发生

动态注冊监听

SQL> select * from v$version where rownum=1; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production SQL> !cat /etc/issue Enterprise Linux Enterpr