IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringCloud Stream整合RabbitMQ各种报错以及解决方案 -> 正文阅读

[Java知识库]SpringCloud Stream整合RabbitMQ各种报错以及解决方案

今天在学习到SpringCloud Stream消息驱动时,工程cloud-stream-rabbitmq-provider8101,作为生产者进行发布消息,使用的RabbitMQ作为消息中间件,启动报错…针对以下几种错误,做出一些个人可行的解决方案,供参考

1. Failed to load property source from location 'classpath:/application.yml

由于视频给出的YAML配置文件是针对本地配置的RabbitMQ,所以原始的yaml为

server:
  port: 8101

spring:
  application:
    name: cloud-rabbitmq-provider
  cloud:
    stream:
      binders: # 配置需要绑定的RabbitMQ的服务信息
        defaultRabbit: # 表示定义的名称,用于binding的整合
          type: rabbit # 消息组件类型
          environment: # 配置RabbitMQ的环境
            spring:
              rabbitmq:
                host: xxxx
                username: xxxx
                password: xxxx
                port: 5672
# 服务的整合处理
      bindings:
        output: # 生产者
          destination: studyExchange      # Exchange名称
          content-type: application/json # 设置消息类型,使用json,文本数据使用"text/plain"
          binder: defaultRabbit       # 设置需要绑定哪一个消息服务(对应消息服务名)

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
  instance:
    lease-expiration-duration-in-seconds: 30 # 心跳的间隔时间
    lease-renewal-interval-in-seconds: 60    # 间隔时间
    instance-id: send-8101.com # 信息列表中显示的主机名
    prefer-ip-address: true    # 访问路径使用IP地址

我这里提出三点可行的方法

  • yaml中不要使用tab来进行缩进,使用空格进行对齐
  • bindings属性中的binder不要缩进,不要缩进,不要缩进,报红是不影响启动的,也可以用{}括起来
  • 由于视频中给出的RabbitMQ是本地启动的,而我是在Linux上开启的一个RabbitMQ,所以上面两个方法都不行,可以尝试以下操作:
  1. 增加一个RabbitMQ的配置,因为视频中给出的方法需要读取两次RabbitMQ配置,第一次找不到就会直接报错无法连接
server:
  port: 8101

spring:
  application:
    name: cloud-rabbitmq-provider
  rabbitmq:
    host: xxxx
    username: xxxx
    password: xxxx
    port: 5672
    
  cloud:
    stream:
      binders: # 配置需要绑定的RabbitMQ的服务信息
        defaultRabbit: # 表示定义的名称,用于binding的整合
          type: rabbit # 消息组件类型
          environment: # 配置RabbitMQ的环境
            spring:
              rabbitmq:
                host: xxxx
                username: xxxx
                password: xxxx
                port: 5672
# 服务的整合处理
      bindings:
        output: # 生产者
          destination: studyExchange      # Exchange名称
          content-type: application/json # 设置消息类型,使用json,文本数据使用"text/plain"
          binder: defaultRabbit       # 设置需要绑定哪一个消息服务(对应消息服务名)

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
  instance:
    lease-expiration-duration-in-seconds: 30 # 心跳的间隔时间
    lease-renewal-interval-in-seconds: 60    # 间隔时间
    instance-id: send-8101.com # 信息列表中显示的主机名
    prefer-ip-address: true    # 访问路径使用IP地址
  1. 另外,检查你在Linux上是否启动了RabbitMQ,以及是否关闭了防火墙,就像这样
    在这里插入图片描述在这里插入图片描述3. 使用你的主机IP地址:15672查看是否能登录RabbitMQ界面
    在这里插入图片描述到这里,基本上就可以解决了。

2. Field messageProvider in com.hz.stream.controller.SendMessageController required a single bean, but 3 were found:

- output: defined by method 'output' in null
- nullChannel: defined in null
- errorChannel: defined in null

这是因为在视频中的MessageProviderImpl类中,Resource是没有指明使用哪一个MessageChannel消息信道的,在Resource注解中指明output,由于当前是消息生产者服务。另外,这里的send方法中return null对发布消息是没有影响的,因为消息生产者服务构建(build)一个Message消息对象,然后传递给Source池,再通过管道binding输出给消息中间件MQ,最后消费者服务的Sink池中可以获取到Message对象

@EnableBinding(Source.class) // 将信道channel和exchange绑定在一起, Source定义消息的推送管到(生产者->Source)
public class MessageProviderImpl implements MessageProvider {

    @Resource(name = "output")
    private MessageChannel messageChannel;

    @Override
    public String send() {
        String serial = UUID.randomUUID().toString();
        // 消息生产者服务构建(build)一个Message消息对象,然后传递给Source池,再通过管道binding输出给消息中间件MQ
        // 最后消费者服务的Sink池中可以获取到Message对象
        messageChannel.send(MessageBuilder.withPayload(serial).build());
        System.out.println("*****serial: " + serial);
        return null;
    }
}

3. 正常启动后,返回工程中的controller方法,报500错误

在这里插入图片描述注意:这里报的空指针异常,并不是因为在serviceImpl中return null导致的, 这里是因为我的粗心没有在MessageProviderImpl上添加注解Autowired导致该对象没有注入进来。

@RestController
public class SendMessageController {

    @Autowired
    private MessageProviderImpl messageProvider;

    @GetMapping("/sendMsg")
    public String sendMessage(){

      return messageProvider.send();
    }
}

4. 启动测试

控制台正常打印出流水号,完美解决!
在这里插入图片描述.另外,查看RabbitMQ的web界面,在交换机一栏中可以看到studyExchange已经成功添加,以及发布消息的曲线图
在这里插入图片描述在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 07:54:26  更:2022-05-08 07:55:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:07:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码