3.RabbitMQ的轮询发送消息

工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进 程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。

1.轮询分发消息图解

注意事项:一个消息只能被处理一次,不可以处理多次,否则会造成重复消费,第一个工作线程接收了消息在第二个工作线程里面就不能被接收了,所以就有了轮询处理消息

三个工作线程的关系是竞争关系

2.工具类

public class RabbitMqUtil {    
    public static Channel getChannel() throws Exception{        
            //创建一个连接工厂        
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("192.168.204.101");
            factory.setUsername("admin");
            factory.setPassword("123");
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();
            return channel;
        }
 }

3. 消费者代码,抽取为两个线程

public class Work01 {

    //队列名称
    public static final String QUEUE_NAME = "hello";

    //接收消息
    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtil.getChannel();

        //接收消息
        DeliverCallback deliverCallback = (consumerTag, message) ->{
            System.out.println("接收到的消息:"+ new String(message.getBody()));
        };

        CancelCallback cancelCallback = (consumerTag) ->{
            System.out.println(consumerTag + "消息者取消消费接口回调逻辑");
        };

        System.out.println("c2等待接收消息...");

        channel.basicConsume(QUEUE_NAME,true, deliverCallback, cancelCallback);

    }

}

注意:两个线程无需编写两套代码,可以利用idea

4. 启动一个生产者线程

public class Task01 {

    public static final String QUEUE_NAME = "hello";

    //发送大量的消息
    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtil.getChannel();
        //队列声明
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //从控制台中接收消息
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String message = scanner.next();
            channel.basicPublish("", QUEUE_NAME,null, message.getBytes());
            System.out.println("发送消息完成:" + message);

        }
    }
}

 C1和C2谁先接收到消息都行,但是如果C1先接收到消息,那么C1就不能接收到下一条消息,必须是C2接收下一条消息

 C1

C2

如果不知道怎么安装和启动RabbitMQ,可以看一下之前的博客,如有问题请各位大佬指正 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值