RabbitMQ(六):RabbitMQ-消费消息-basicConsume

转载地址: https://www.jianshu.com/p/df231c152754

RabbitMQ-消费消息

        Address[] addresses = new Address[] {new Address(IP_ADDRESS, PORT)};

        /**
         * 1.建立连接工厂
         */
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setUsername(USER_NAME);
        connectionFactory.setPassword(PASSWORD);

        /**
         * 网络故障自动连接恢复
         */
        connectionFactory.setAutomaticRecoveryEnabled(true);

        /**
         * 2.创建连接 和生产者有一点不同
         */
        Connection connection = connectionFactory.newConnection(addresses);

        /**
         * 3.创建信道
         */
        final Channel channel = connection.createChannel();    

        /**
         * 4.设置客户端最多接收示被ack的消息个数
         */
        channel.basicQos(64);
        Consumer consumer  =new DefaultConsumer(channel) {

            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)

                    throws IOException {

                System.out.println("接收消息 :   "+new String(body));

                try {

                    TimeUnit.SECONDS.sleep(1);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

                //消息确认
                channel.basicAck(envelope.getDeliveryTag(), false);
            }
        };

        /**
         * 回调
         */
        channel.basicConsume(QUEUR_NAME, consumer);

        /**
         * 关闭资源
         */
        TimeUnit.SECONDS.sleep(5);

        channel.close();

        connection.close();

basicConsume方法

 String basicConsume(String queue, Consumer callback) throws IOException;

 String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException;

 String basicConsume(String queue, boolean autoAck, Map<String, Object> arguments, Consumer callback) throws IOException;

 String basicConsume(String queue, boolean autoAck, String consumerTag, Consumer callback) throws IOException;

 String basicConsume(String queue, boolean autoAck, String consumerTag, boolean noLocal, boolean exclusive, Map<String, Object> arguments, Consumer callback) throws IOException;

queue 队列名

autoAck 是否自动确认消息,true自动确认,false 不自动要手动调用,建立设置为false

//消息确认

channel.basicAck(envelope.getDeliveryTag(), false);

consumerTag 消费者标签,用来区分多个消费者

noLocal 设置为true,表示 不能将同一个Conenction中生产者发送的消息传递给这个Connection中 的消费者

exclusive 是否排他

arguments 消费者的参数

callback 消费者 DefaultConsumer建立使用,重写其中的方法

      @Override
      public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body);

重写的方法

    @Override
    public void handleConsumeOk(String consumerTag) {
        this._consumerTag = consumerTag;
    }

    @Override
    public void handleCancelOk(String consumerTag) {
        // no work to do
    }
 
    @Override
    public void handleCancel(String consumerTag) throws IOException {
        // no work to do
    }

    @Override
    public void handleShutdownSignal(String consumerTag, ShutdownSignalException sig) {
        // no work to do
    }

    @Override
    public void handleRecoverOk(String consumerTag) {
        // no work to do
    }

handleShutdownSignal方法 当Channel与Conenction关闭的时候会调用,

handleCancelOk方法会在其它方法之前调用,返回消费者标签

*handleCancelOk与handleCancel消费者可以显式或者隐式的取水订单的时候调用,也可以通过

channel.basicCancel方法来显式的取消一个消费者订阅

会首先触发handleConsumeOk方法,之后触发handleDelivery方法,最后才触发handleCancelOk方法

channel.basicAck();确认消息

deliveryTag:该消息的index

multiple:是否批量.true:将一次性ack所有小于deliveryTag的消息。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值