6.rabbitmq的两种消费者模式basicConsume和basicGet

basicConsume模式

该模式的主体是队列,采用的是发布订阅的模式,当队列中有新的消息时,队列就会主动将消息推送给消费者进行消费。它保证了消费者能够及时的获取到相关的消息。其建立道德连接是长连接,比较节约资源,官方推荐使用该方法

basicGet模式

该模式的主体是消费者,当消费者需要队列中的一条消息时,可以通过该方法去获取到队列中的一条消息。其建立的连接是短连接,当消费者获取到消息后该连接断开,可以通过循环的方式实现和basicConsume相同的效果,但不建议这样去使用。

public class Recv1 {
    public static void main(String[] args) throws IOException {
        Connection connection = MqUtil.getConnection();
        final Channel channel = connection.createChannel();
        channel.queueDeclare("work",true,false,false,null);
        // 设置通道的预取数量为1,官方推荐100到300,数据会影响其吞吐量
        channel.basicQos(10);
        // 关闭消息的自动确认机制
        /*
        * 参数1: 队列名称
        * 参数2: 是否自动确认
        * */
        GetResponse work = channel.basicGet("work", true);
        System.out.println(new String(work.getBody()));
//        channel.basicConsume("work", false, new DefaultConsumer(channel) {
//            @Override
//            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//                try {
//                    System.out.println(new String(body) + "----" + envelope.getDeliveryTag());
//                    // 在处理完消息后手动进行确认
//                    /*
//                     * 参数1: 消息标签
//                     * 参数2: 是否批量进行确认
//                     * */
//                    channel.basicAck(envelope.getDeliveryTag(), true);
//                } catch (Exception e) {
//                    channel.basicNack(envelope.getDeliveryTag(), false,true);
//                }
//            }
//        });
    }
}

你可能感兴趣的:(rabbitmq,队列,java,rabbitmq)