RabbitMQ入门

简介:

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

核心概念

Message:
消息,消息是不具名的,它是由消息头和消息体组成。消息体是不透明的,而消息体则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。

Publisher:
消息的生产者,也是一个向交换器发布消息的客户端应用程序

Exchange:
交换器,用来接收生产者发送的消息并将这些消息给服务器中的队列。
Exchange有4种类型:direct(默认)、fanout、topic、headers,不同类型的Exchange转发消息的策略有所区别。

Rabbit安装

因为Rabbit是基于Erlang语言编写,所以安装Rabbit前需要先安装Erlang。

这个Erlang安装otp_win64_20.3.exe这个版本就可以了,百度一下这个版本就可以搜到下载的资源,安装教程也有,包括环境变量什么的,这里就不在演示。

然后就需要安装rabbitmq-server-3.7.7.exe百度一下资源,然后安装,安装之后的额目录是这个样子的

RabbitMQ入门_第1张图片
打开sbin文件夹,在这个文件夹的里面打开cmd黑窗口,输入rabbitmq-plugins.bat enable rabbitmq_management
启动服务。或者手动开启服务(如下图)
RabbitMQ入门_第2张图片
打开之后可以使用http://localhost:15672访问,会出现如下图,让你登录的页面,默认密码和账号都是guest。
RabbitMQ入门_第3张图片
这个时候通过localhost是可以登录的,但如果把localhost换成你电脑的本地IP地址就会提示你无法登录。
这个时候你可以选择:1、现用localhost形式登进去,创建一个新的用户名,用新的用户名和密码登录即可。2、找到安装目录ebin下的rabbit.app文件
RabbitMQ入门_第4张图片
把第39[]里面的内容清空。如下图即可使用本地IP地址登录。
RabbitMQ入门_第5张图片

登录进去之后就如下图

RabbitMQ入门_第6张图片
可以先在这web视图上创建队列和消息(省略)。

使用前提

首先需要导入pom依赖

        <!--   引入RabbitMQ模块     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

在启动类上标注 == @EnableRabbit == 注解,表示开启基于注解的RabbitMQ

@SpringBootApplication
@EnableRabbit //开启消息中间件
public class SpringBootWebRestfulcrudApplication {
     
    public static void main(String[] args) {
     
        SpringApplication.run(SpringBootWebRestfulcrudApplication.class, args);
    }

}

使用AmqpAdmin创建交换器和消息队列并绑定关系

@RestController
public class RabbitController {
     

    @Autowired
    AmqpAdmin amqpAdmin;

    /**
     * 创建Exchange和Queue并绑定关系
     * 删除
     */
    @PublicInterface
    @RequestMapping("/test/create")
    public void create(){
     
        /**
         * 创建Exchange(交换器)
         * new DirectExchange:创建什么类型的Exchange
         * 里面的参数可根据需要进行填写,如:是否持久化、是否自动删除
         */
        amqpAdmin.declareExchange(new DirectExchange("zhao.exchange"));
        /**
         * 创建Queue(消息队列)
         * new Queue:创建Queue
         * 参数同理
         */
        amqpAdmin.declareQueue(new Queue("zhao.queue",true));
        /**
         * 创建绑定规则
         * 参数1:目的地
         * 参数2:队列(QUEUE)
         * 参数3:Exchange名称
         * 参数4:路由键
         * 参数5:消息头
         */
        amqpAdmin.declareBinding(new Binding("zhao.queue",Binding.DestinationType.QUEUE,
                "zhao.exchange","zhao.ha",null));
        //删除对应的操作
        //amqpAdmin.deleteExchange("zhao.exchange");
        //amqpAdmin.deleteQueue("zhao.queue");
    }
}

运行访问创建接口,即可创建交换器和消息队列并绑定他们之间的关系

发送消息代码测试

@RestController
public class RabbitController {
     

    /**
     * 自动配置
     * 1、RabbitAutoConfiguration
     * 2、有自动配置连接工厂:ConnectionFactory
     * 3、RabbitProperties 封装的 RabbitMQ的配置
     * 4、RabbitTemplate: 给RabbitMQ发送和接收消息
     * 5、AmqpAdmin:系统管理功能组件
     *   AmqpAdmin:创建和删除、Queue、Exchange、Binding
     */
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 单播(点对点)
     * 给消息中间件发送消息
     */
    @PublicInterface
    @RequestMapping("/test/convertAndSend")
    public void contextLoads(Integer id){
     
        TestUser user = new TestUser();
        user.setToken("token");
        user.setUserId(id);
        user.setUserName("张胜");
        user.setUserPass("123456");
        //对象被序列化以后发送出去
        rabbitTemplate.convertAndSend("exchang.direct","atguigu.emps",user);
    }

    /**
     * 单播(点对点)
     * 读取消息中间件中的消息
     */
    @PublicInterface
    @RequestMapping("/test/receive")
    public void receive(){
     
        Object obj = rabbitTemplate.receiveAndConvert("atguigu.emps");
        System.out.println(obj);
    }
}

可以发送消息和接收消息。这个是你发送了消息需要手动的去接收消息,下面展示发送消息自动接收,发送消息接口不变,然后在service层方法上使用==@RabbitListener==注解即可自动接收消息。

@Service
public class RabbitServiceImpl {
     

    /**
     * 直接返回实体对象
     * @param user
     */
    @RabbitListener(queues = "atguigu.emps")
    public void rabbitTest(TestUser user){
     
        System.out.println("收到消息"+user);
    }

    /**
     * 返回消息头等信息
     */
//    @RabbitListener(queues = "atguigu.emps")
    public void rabbitTests(Message message){
     

        System.out.println("收到消息"+message.getBody());
    }

}

控制台就会自动打印接收的消息。

你可能感兴趣的:(SpringBoot,队列,rabbitmq,spring,boot)