栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【无标题】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【无标题】

rabbitMQ基本知识

mq是常见的物理解耦+逻辑解耦
provider提供服务只需要对着mq进行发布消息,mq会转发给comsumer就可以接触耦合(逻辑上解耦了,物理上也解耦了)
为什么需要使用mq
1.流量消峰 # 在访问量突然增长的时候,mq就可以当做一个缓存的队列。
2.应用解耦 # 应用之间中间多了一个mq,假如订单系统坏了,消息会缓存在mq中,不会直接导致其他的系统也受到影响。
3.异步处理 # 如果应用A调用了B的服务,但是B需要一段时间才可以处理结束,但是A需要知道B什么时候才可以执行完成,这时候一般可以采用两种方式,1.A调用B的查询api,查询什么时候执行完成。2.B提供一个callback的api,B执行完后调用callback通知A。使用mq,B执行完发送消息给mq,mq再把消息通知A,A即可以及时的处理信息,也不用一直去询问B
四大核心概念
生产者、
交换机 交换机接收来自生产者的消息,又把消息推送到队列中,(交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定)
队列 队列是一种数据结构,先进先出,是一个缓存区
消费者

rabbitMQ执行原理图

创建provider

``java

        //通过工厂创建连接
        private final static String QUEUE_NAME = "hello";
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("8.130.15.205");
        factory.setUsername("guest");
        factory.setPassword("guest");

        //channel实现类close接口自动关闭,不用手动关闭
        Channel channel = factory.newConnection().createChannel();
        
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        String message="hello world";
        
        channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
        System.out.println("消息发送完毕");
```
ConnectionFactory factory = new ConnectionFactory();
       factory.setHost("8.130.15.205");
       factory.setUsername("guest");
       factory.setPassword("guest");
       Connection connection = factory.newConnection();
       Channel channel = connection.createChannel();
       System.out.println("等待接收消息....");

       //推送的消息如何进行消费的接口回调
       DeliverCallback deliverCallback = (consumerTag, delivery) -> {
           String message = new String(delivery.getBody());
           System.out.println(message);
       };

       //取消消费的一个回调接口 如在消费的时候队列被删除掉了
       CancelCallback cancelCallback = (consumerTag) -> {
           System.out.println("消息消费被中断");
       };

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

rabbitMQ的手动应答和自动应答
自动应答:消费者接收到消息就应答rabbitMQ,rabbitmq直接删除消息。
自动应道还分批量应答,和单个应答
手动应答:在处理完消息才确定应答

 
        channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        };
        //采用手动应答
        boolean autoAck = false;
        channel.basicConsume("two", autoAck, deliverCallback, (consumerTag) -> {
            System.out.println(consumerTag + "消费者取消消费接口回调逻辑");

        });
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/872597.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号