消息队列-RabbitMQ

狂风中的少年 提交于 2019-12-25 02:55:47

什么是消息队列?

消息队列是一种在应用(服务)间的通讯方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。

常用的消息队列有哪些?

  • RabbitMQ
  • Kafka
  • ActiveMQ
  • RocketMQ(阿里的)

RabbitMQ实战

安装RabbitMQ
  • 方式1:windows下安装包安装
    • 因为RabbitMQ 是一个由 Erlang 语言开发的,所有安装之前要安装Erlang:Erlanng官网
    • 去RabbitMQ下载安装包:RabbitMQ官网
    • 开始安装-RabbitMQ安装包进行傻瓜式安装即可
    • 在windows下配置erlang环境变量
    • 进入RabbitMQ的安装bin目录,执行命令:
    rabbitmq-plugins enable rabbitmq_management---安装管理插件
    
  • 方式2:docker安装(笔者推荐)
docker pull rabbitmq:3.7.7-management :拉取镜像
docker run -d  -p 15672:15672(管理界面端口映射)  -p  5672:5672(TCP端口映射,服务通过此端口与RabbitMQ建立TCP连接,完成异步消息监听和发送)   --name rabbitMQ 2888deb59dfc(拉取镜像的id)
连接配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
依赖包
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.47</version>
</dependency>

注:用localhost连接只可以在默认账户下,若想用本机ip连接需创建新的用户并赋予相应管理员权限。

消息发布者
  • 定义消息队列(发布者定义即可)
package com.hfcsbc.springBootWeb.config;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {
    @Bean
    public Queue queue() {
        return new Queue("rabbitMQ_message" , true);
    }
}
  • 接口入参
package com.hfcsbc.springBootWeb.cmd;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class RabbitMQMessageCmd {
    private String messageName;
    private String content;
}

  • 自定义消息
package com.hfcsbc.springBootWeb.message;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class RabbitMQMessage {
    private String messageName;
    private String content;
}

  • 发布消息
package com.hfcsbc.springBootWeb.controller;

import com.alibaba.fastjson.JSONObject;
import com.hfcsbc.springBootWeb.cmd.RabbitMQMessageCmd;
import com.hfcsbc.springBootWeb.message.RabbitMQMessage;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/rabbitMQ")
public class RabbitMQController {

    @Autowired
    private RabbitTemplate template;

    @PostMapping("/sendMessage")
    public void sendRabbitMQMessage(@RequestBody RabbitMQMessageCmd cmd){
        String json = JSONObject.toJSONString(new RabbitMQMessage(cmd.getMessageName(),cmd.getContent()));
        template.convertAndSend("rabbitMQ_message",json);
    }
}

消息消费者
  • 消息监听处理
package liang.project.merengues.listener;

import com.alibaba.fastjson.JSONObject;
import liang.project.merengues.message.RabbitMQMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class RabbitMQListener {

    @RabbitListener(queues = "rabbitMQ_message")
    public void listener(String jsonString){
        RabbitMQMessage message = JSONObject.parseObject(jsonString, RabbitMQMessage.class);
        log.info(message.getMessageName());//处理你自己的业务代码
    }
}

  • 控制台打印消息
    在这里插入图片描述
RabbitMQ管理端查看队列里未消费的消息
  • localhost:15672登录管理端查看
  • 在这里插入图片描述
总结

1.rabbitMQ建议使用docker安装。
2.连接配置注意连接的ip。
3.docker安装后注意端口的映射。
4.笔者认为RabbitMQ配置简单容易理解和上手。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!