03_RabbitMQ快速入门案例

RabbitMQ快速入门案例

新建一个maven过程

导入依赖

 <!--   引入rabbitmq的依赖     -->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.10.0</version>
        </dependency>

producer

  • 打断点一步一步查看
package com.tian.rabbitmq.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class Producer {
    public static void main(String[] args) {
        //所有的中间件技术都是基于tcp/ip协议基础之上构建新型的协议规范,只不过rabbitmq遵循的是amcp
        // ip port


        //1:创建连接工程
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.1.150");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            //2:创建连接connection
            connection = connectionFactory.newConnection("生产者");

            //3:通过连接获取通道Channel
            channel = connection.createChannel();

            //4:通过创建交换机,声明队列,绑定关系,路由key, 发送消息,和接收消息
            String queueName = "queue1";
            /**
             * @params1 队列的名称
             * @params2 是否持久化
             * @params3 排他性
             * @params4 是否自动删除
             * @params5 携带附属参数
             */
            channel.queueDeclare(queueName, false, false, false, null);
            //5:准备消息内容
            String message = "hello rabbitmq";
            //6:发送消息给队列queue
            channel.basicPublish("", queueName, null, message.getBytes());
            System.out.println("消息发送成功");

        } catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            //7:关闭连接
            if(channel!=null&&channel.isOpen()){
                try {
                    channel.close();
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
            //8:关闭通道
            if(connection!=null&&connection.isOpen()){
                try {
                    connection.close();
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
        }
    }
}

consumer

package com.tian.rabbitmq.simple;

import com.rabbitmq.client.*;

import java.io.IOException;

public class Consumer {
    public static void main(String[] args) {
        //1:创建连接工程
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.1.150");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            //2:创建连接connection
            connection = connectionFactory.newConnection("生产者");

            //3:通过连接获取通道Channel
            channel = connection.createChannel();

            channel.basicConsume("queue1", true, new DeliverCallback() {
                public void handle(String s, Delivery delivery) throws IOException {
                    System.out.println("收到的消息是" + new String(delivery.getBody(), "UTF-8"));
                }
            }, new CancelCallback() {
                public void handle(String s) throws IOException {
                    System.out.println("接收失败了");
                }
            });

            System.out.println("开始接收消息");
            System.in.read();

        } catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            //7:关闭连接
            if(channel!=null&&channel.isOpen()){
                try {
                    channel.close();
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
            //8:关闭通道
            if(connection!=null&&connection.isOpen()){
                try {
                    connection.close();
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
        }
    }
}

什么是AMQP

AMQP全称: Advanced Message Queuing Protocol(高级消息队列协议)。是应用层协议的一个开发标准,为面向消息的中间件设计。

AMQP生产者流传过程

在这里插入图片描述

RabbitMQ的核心组成部分

在这里插入图片描述

核心概念

Server : 又称Broker ,接受客户端的连接,实现AMQP实体服务。安装rabbitmq-server

Connection: 连接,应用程序与Broker的网络连接TCP/IP/三次握手和四次挥手

Channel: 网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立对各Channel,每个Channel代表一个会话任务。

Message : 消息:服务与应用程序之间传送的数据,由Properties和body组成,Properties可是对消息进行修饰,比如消息的优先级,延迟等高级特性,Body则就是消息体的内容。

Virtual Host 虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个虚拟主机理由可以有若干个Exhange和Queueu,同一个虚拟主机里面不能有相同名字的Exchange

Exchange :交换机,接受消息,根据路由键发送消息到绑定的队列。(不具备消息存储的能力)

Bindings : Exchange和Queue之间的虚拟连接,binding中可以保护多个routing key.

Routing key :是一个路由规则,虚拟机可以用它来确定如何路由一个特定消息。

Queue : 队列:也成为Message Queue,消总队列,保存消息并将它们转发给消费者。

//@params1:交换机 @params2 队列 路由key @params3 消息的控制状态 @params4 消息主题
//面试题 可以存在没有交换机的队列嘛?不可能,虽然没有指定交换机但是一定会存在一个默认的交换机
channel.basicPublish("", queueName, null, message.getBytes());
         

RabbitMQ整体架构图

在这里插入图片描述

RabbitMQ的运行流程

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值