RabbitMQ

docker运行:

docker run -e RABBITMQ_DEFAULT_USER=ITCAST -e RABBITMQ_DEFAULT_PASS=123 --name mq -p 15672:15672 -p 5672:5672 -d rabbitmq
1.进入容器
docker exec -it mq /bin/bash
2.开启web页面管理
rabbitmq-plugins enable rabbitmq_management

消息队列——生产者、消费者模型

应用:

1.跨系统数据传递

2.高并发的流量削峰

3.数据的并发和异步处理

组成部分:

Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列
Queue:消息队列,存储消息的队列,消息到达队列并转发
Producer:消息生产者
Consumer:消息消费者
 

生产者发送消息流程:

主要maven

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

1.建立tcp连接

ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("");
connectionFactory.setPort("");
connectionFactory.setVirtualHost("/");设置虚拟机
connectionFactory.setUsername("");
connectionFactory.setPassword("");

2.建立通道

Connection connection = connectionFactory.newConnection(connectionName);
//通过连接获取通道Channel
Channel channel = connection.createChannel();
//通过创建交换机,声明队列;绑定关系;路由,来发送消息和接收消息
/*
*@params1 队列的名称
*@params2 是否需要持久化
*@params3 排他性,是否是独占队列
*@params4 是否自动删除,指最后一个消费者消费完消息后,是否把队列自动删除
*@params5 携带附加参数,信息
*/
channel.queueDeclare(queuename,durable,exclusive,autoDelete,arguments);
//发送消息
String message = "";
channel.basicPublish(exchange,queueName,message.getBytes());

connection.close();
channel.close();

3.发送消息,由交换机发送到指定队列

消费者消费流程:

建立连接,建立通道,监听指定的queue,ack回复


        DefaultConsumer consumer = new DefaultConsumer(channel){
            // 获取消息,并且处理,这个方法类似事件监听,如果有消息的时候,会被自动调用
            /**
             * 当接收到消息后此方法将被调用
             * @param consumerTag  消费者标签,用来标识消费者的,在监听队列时设置channel.basicConsume
             * @param envelope 信封,通过envelope
             * @param properties 消息属性
             * @param body 消息内容
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //交换机
                String exchange = envelope.getExchange();
                //消息id,mq在channel中用来标识消息的id,可用于确认消息已接收
                long deliveryTag = envelope.getDeliveryTag();
                // body 即消息体
                String msg = new String(body,"utf-8");
                System.out.println(" [x] received : " + msg + "!");
            }
        };
        
        // 监听队列,第二个参数:是否自动进行消息确认。
        //参数:String queue, boolean autoAck, Consumer callback
        /**
         * 参数明细:
         * 1、queue 队列名称
         * 2、autoAck 自动回复,当消费者接收到消息后要告诉mq消息已接收,如果将此参数设置为tru表示会自动回复mq,如果设置为false要通过编程实现回复
         * 3、callback,消费方法,当消费者接收到消息要执行的方法
         */
        channel.basicConsume(QUEUE_NAME, true, consumer);

通过channel而不是连接,是由于性能更高,不用每次都先建立连接,三次握手等

利用rabbitTemplate发送

        添加连接信息:

spring:
  rabbitmq:
    host: http://192.168.91.128
    port: 5672          #mq服务器port,默认为5672
    username: ITCAST     #mq服务器username,默认为gust
    password: 123     #mq服务器password,默认为guest

        使用rabbitTemplate发送

        使用监听接收数据:

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值