Rabbitmq示例之工作(公平)队列

上一篇 << 下一篇 >>>Rabbitmq示例之发布订阅模式


1.原理

a、channel.basicQos(1);----每次只会给消费者推送1条消息,等待手动ack确认后才会继续发送
b、手动确认ack操作
优点:实现能者多劳的公平性了

2.消费者接受消息代码示例

/**
 * 消费者接受消息
 * a、channel.basicQos(1); 每次推送一个,消费成功后再推送下一个
 * b、channel.basicConsume(QUEUE_NAME, false, defaultConsumer); 改为手动应答模式
 * c、channel.basicAck(envelope.getDeliveryTag(),true); 手动应答
 * 分别设置sleepTime开启多线程测试
 *
 */
public class Worker {

    private static int sleepTime = 2000;
    private static final String QUEUE_NAME = "test1205";

    public static void main(String[] args) throws IOException, TimeoutException {
        System.out.println("work:"+sleepTime+"启动");
        Connection connection = RabitMQConnection.getConnection();
        Channel channel = connection.createChannel();
        channel.basicQos(1);
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String msg = new String(body, "UTF-8");
                System.out.println(msg+"--消费成功");
                try {
                    Thread.sleep(sleepTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                channel.basicAck(envelope.getDeliveryTag(),true);
            }
        };
        channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
    }
}

3.效果示例


推荐阅读:
<<<消息中间件的核心思想
<<<消息中间件常见问题汇总
<<<基于Netty简单手写消息中间件思路
<<<消息队列常用名词与中间件对比
<< << << << << << << << << << << << << << << << << << << << << << << << << << << << << << << <<

你可能感兴趣的:(Rabbitmq示例之工作(公平)队列)