目录
一、问题描述
二、问题解决过程
三、总结
四、拓展
一、问题描述
近期在写一个RabbitMQ基于springboot的使用damon的时候,在启动消费者服务的时候一直发现连接不上RabbitMQ,很是纳闷,配置文件大概如下:
server:
port: 8182
servlet:
context-path: /
spring:
application:
name: consumer-service
main:
allow-bean-definition-overriding: true
#配置rabbitmq
rabbitmq:
host: 110.40.209.16
port: 5672
virtual-host: /
username: zhuoye
password: zhuoye5211314
listener:
simple:
prefetch: 1 #每次只能处理一个,处理完成才能获取下一个消息
acknowledge-mode: auto #自动进行消费者确认
retry:
enabled: true # 开启重试机制,本地重试
initial-interval: 1000ms #设置失败等待时长为1秒
multiplier: 1.2 #下次失败的等待时长倍数
max-attempts: 3 #最大重试次数3次
stateless: true
启动的时候 报错如下:
二、问题解决过程
第一反应就是检查配置文件,是不是配置文件哪里写的不对。首先就是检查ip地址、端口、账号、密码信息。然而,发现并没有问题。是不是近视了,在看一遍?还是没发现问题。而且生产者服务配置也是这样,但是都能够正确的把消息发送到RabbitMQ上的目标队列上面。
难道见鬼了?
我不死心,我重启服务、我重启服务........
我清除IDEA缓存重启........
我重启电脑!
奇迹没有发生,看来只能靠自己了。淡定、淡定!再仔细分析分析报错信息。
发现重点了!消费者服务启动日志里面,在尝试连的RabbitMQ是localhost,而不是我配置文件里面配置的host地址。这也就是配置文件没有生效!
迅速百度,springboot配置文件不生效的原因有哪些。百度里进行筛选有用的信息,发现大部分都是说pom文件有问题。那就检查检查pom文件哪里有问题。啊?我丢!打包方式竟然是pom!
而pom类型通常用于组织和管理多个模块的项目,它本身不包含代码,只包含项目的配置信息和依赖关系。所以,它也就不会去寻找配置文件。一般我们使用<packaging>pom</packaging>都是在项目聚合的时候,父工程的pom文件里面使用。比如,我这个包含两个服务的RabbitMQ使用的damon。
在父工程rabbitmq-demo的pom文件里面就需要使用 <packaging>pom</packaging>,并且指定子模块。这样,在父工程的pom文件里面的依赖才能够被两个子项目使用。
找到原因之后,我们就将消费者服务的pom文件中的<packaging>pom</packaging>改成<packaging>jar</packaging>,刷新pom文件,并clean项目。再次启动,成功连上RabbitMQ!
三、总结
遇到问题一定不要慌,认真分析日志信息,一定能够找到蛛丝马迹的。日志信息会让你少走需多弯路!
四、拓展
在我们指定打包类型的时候都是使用的packagin标签。
1、当我们想要打成jar包的时候就使用<packaging>jar</packaging>,不使用该标签的时候,默认也是打成jar包。
2、当我们想要打成war包的时候就使用<packaging>war</packaging>,当我们需要把项目部署在容器中的时候,就使用这种打包方式。
3、当在父工程中的时候都是使用<packaging>pom</packaging>