RabbitMQ使用

技术分享
193 0

rabbitmq的优点

可以异步执行,等等,优点很多这里不过多废话,请直接进入实际开发流程

使用docker命令安装

docker run -d --hostname my-rabbit -v /mq/plugins:/plugins --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq
-d 后台运行容器;
--name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
-v 映射目录或文件;
--hostname  主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;
RABBITMQ_DEFAULT_PASS:默认用户名的密码)

启动rabbit管理页面,不然无法进入管理页面

docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management

错误提示信息

Management API returned status code 500
修改方法为:

1、进入docker

2、执行如下命令

cd /etc/rabbitmq/conf.d/
echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf

3、重启RabbitMQ

重启RabbitMQ

网页端登陆地址 ip:15672

登陆默认账号/密码 guest

注意:默认的用户使用java连接的时候连接地址只能填写localhost,可以在额外创建一个账户,并设置admin权限

使用springboot进行实战演示

先引入必备包

<!--进入测试包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <!--AMQP依赖,包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <!--引入消息转换器-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

知识点

//    测试交换机的收发 - 所有的交换机都需要输入key,但是fanout可以输入null的key也就是所有绑定的都可以收到消息
    @Test
    void testSend() throws InterruptedException {
        String bluemsg = "blue msg";
        CorrelationData cd = new CorrelationData(UUID.randomUUID().toString());
        cd.getFuture().addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {
            @Override
            public void onFailure(Throwable ex) {
                log.error("消息回调失败",ex); //基本上不会发生
            }
            @Override
            public void onSuccess(CorrelationData.Confirm confirm) {
                log.debug("收到confirm callback包回执");
                System.out.println(confirm.isAck());
                if (confirm.isAck()) {
//                    消息发送成功
                    log.info("消息发送成功,收到ack");

                } else {
//                    这里应该重发消息,
                    log.error("消息发送失败,收到nack");
                }
            }
        });
        //消息到达了交换机,但是发送到队列的时候出错了(如果key不存在),返回ack但是有return返回值
        //消息没有到达mq交换机会返回nack ,没有return返回值(代码问题,如路由不存在)
        //只要到达mq交换机都是ack,列队没收到返回返回ack+路由错误
        rabbitTemplate.convertAndSend("nbsb.direct5  ", "blue", bluemsg, cd);
        Thread.sleep(2000);
    }

springamqp

springmq

设计思路(仅作为参考)

这个回调和发消息都在一个方法里定义的, 失败了调用convert重发或是写数据库交给定时任务重发都可以

问题

问题1:springboot项目使用spring-boot-starter-amqp连接rabbitmq时出现报错:

Failed to check/redeclare auto-delete queue(s).
思路
这类问题是因为没有连接上rabbitmq导致的,一般可以的原因有如下几种:

1、springboot中的配置文件配置的不对,这其中又分为:
(1)配置项格式出错,比如yml格式常见的配置项错位
(2)rabbitmq地址错误
(3)端口错误
这里给出一个最基本的配置项作为参考

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    virtual-host: /

2、rabbitmq所在服务器或虚拟机中的对应端口没有打开,比如默认的5672端口没有开放,如果是外网地址的,还要打开内外网端口映射。这一点可以通过telnet指令检查

telnet 192.168.1.1 5672

3、rabbitmq地址有误,或者rabbitmq所在服务器的网络存在问题,无法连接,这点可以通过ping来测试

ping 192.168.1.1

4、配置的账号没有开通对应权限
进入rabbitmq管理页面的用户页面后可以看到对应的账户是否有开通权限,如图所示即没有开通权限

没有开通权限

点击对应的用户名,进入权限设置页面
如图所示,我们给予其配置、读、写的权限,并将其赋予管理员角色

赋予管理员角色

配置之后再看用户权限就发生了变化了

2023-11-28T14:27:07.png

5、virtual-host配置的有误,springboot中配置的virtual-host与rabbitmq中的virtual-host没有对应上,需要注意的是如果在rabbitmq中配置的virtual-host叫xxx的话,那么springboot中的也一定是xxx,而不需要再之前加上/

最后更新 2023-11-28
评论 ( 0 )
OωO
隐私评论