zoukankan      html  css  js  c++  java
  • Native RabbitMQ ProducerComfirm

    发布者确认模式

    注意,这里需要开启确认模式:channel.confirmSelect()

    /**
     * 发布者确认回调
     * handleAck:消息经由交换器,路由键,成功到达了队列,会调用此方法
     * handleNack:消息经由交换器,路由键在到达队列的途中,MQ内部出现异常会调用此方法
     *
     * @author zhangjianbing
     * time 2020/9/7
     */
    @SuppressWarnings("Duplicates")
    public class ProducerConfirm {
    
        public static final String EXCHANGE_NAME = "confirm-exchange";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            // 创建连接工厂
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.setHost("1.1.1.1");
            connectionFactory.setPort(5672);
            connectionFactory.setUsername("beijing");
            connectionFactory.setPassword("123456");
            connectionFactory.setVirtualHost("beijing");
            // 创建连接
            Connection connection = connectionFactory.newConnection();
            // 创建信道
            Channel channel = connection.createChannel();
            // 在信道中设置交换器
            channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true);
            channel.confirmSelect();// 开启发布者确认
            // 设置路由键
            String routeKey = "confirm";
            // 消息
            String message = "hello rabbit message queue";
    
            String queueName = "CONFIRM.CALLBACK.QUEUE";
            channel.queueDeclare(queueName, true, false, false, null);
    
            // 将队列和交换器通过路由键绑定在一起
            channel.queueBind(queueName, EXCHANGE_NAME, routeKey);
    
            channel.addConfirmListener(new ConfirmListener() {
    
                @Override
                public void handleAck(long deliveryTag, boolean multiple) throws IOException {
                    System.out.println("【消息成功到达了队列】");
                }
    
                @Override
                public void handleNack(long deliveryTag, boolean multiple) throws IOException {
                    System.out.println("【MQ内部出现异常】");
                }
    
            });
    
            // 发送消息
            channel.basicPublish(EXCHANGE_NAME, routeKey, false, null, message.getBytes());
    
            try {
                Thread.sleep(500);// 【这里需要将关闭连接的操作去掉,或者延迟,否则回调不到】
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 关闭信道和连接
            channel.close();
            connection.close();
        }
    
    }
    
  • 相关阅读:
    altium designer 工程中的原理图库和封装如何提取出来
    555是集成电路
    安装JDK+Tomcat,进行环境变量设置,和运行JSP
    2018年房价会涨吗?
    MySQLroot密码的恢复方法
    mysql中的数据类型长度
    感觉还不错,受益很高,有保障
    phpstorm问题
    Mac上的抓包工具Charles
    解决Firefox显示“已阻止载入混合活动内容”的方法
  • 原文地址:https://www.cnblogs.com/zhangjianbing/p/13629334.html
Copyright © 2011-2022 走看看