alibaba / spring-cloud-alibaba

Spring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware.
https://sca.aliyun.com
Apache License 2.0
27.91k stars 8.33k forks source link

spring-cloud-stream-binder-rocketmq worked abnormal when updated to Spring Cloud 2022 #3234

Closed zsh9527 closed 1 year ago

zsh9527 commented 1 year ago

RocketMQComponent4BinderAutoConfiguration does not loading bean named DefaultMQProducer, RocketMQTemplate it work corrort in spring cloud 2021, but failed in spring cloud 2022

new environment JDK17 spring cloud 2022.0.1 spring boot 3.0.2

old environment JDK11 spring cloud 2021.0.2 spring boot 2.6.7

gradle dependence implementation("org.springframework.cloud:spring-cloud-stream-binder-rocketmq:0.9.0.RELEASE") or implementation("com.alibaba.cloud:spring-cloud-stream-binder-rocketmq:2.2.0.RELEASE")

spring config

 stream:
      defaultBinder: rocketmq
      binders:
        zipkin:
          type: kafka
        rocketmq:
          type: rocketmq
      rocketmq:
        binder:
          enable-msg-trace: false
        bindings:
          handleEosResult-in-0:
            consumer:
              tags: tag_name
yuluo-yx commented 1 year ago

Can you provide relevant stack exception information, or a minimalist demo, so that the community can replicate and handle the problem!

zsh9527 commented 1 year ago

Can you provide relevant stack exception information, or a minimalist demo, so that the community can replicate and handle the problem!

build.gradle

plugins {
    id 'org.springframework.boot' version '3.0.2'
    id 'io.spring.dependency-management' version '1.1.0'
    id("java")
}

group = "org.example"
version = "1.0-SNAPSHOT"
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2022.0.1")
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-aop")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.cloud:spring-cloud-stream")
    implementation("org.springframework.cloud:spring-cloud-starter")
    implementation("org.springframework.cloud:spring-cloud-stream-binder-rocketmq:0.9.0.RELEASE")
}

dependencyManagement {
    imports {
        mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}")
    }
}

application.yml

spring:
  application:
    name: untitled
  cloud:
    stream:
      defaultBinder: rocketmq
      binders:
        rocketmq:
          type: rocketmq
      rocketmq:
        binder:
          name-server: dev1.rocketmq.leve.com:9876;dev2.rocketmq.leve.com:9876
          enable-msg-trace: false

Main Class

package org.example;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * ${NAME}
 *
 * @author zsh
 * @version 1.0.0
 * @date ${YEAR}/${MONTH}/${DAY} ${HOUR}:${MINUTE}
 */
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(MainApplication.class);
        ConfigurableApplicationContext applicationContext = application.run(args);
        DefaultMQProducer defaultMQProducer = applicationContext.getBean(DefaultMQProducer.class);
    }
}

Error log

2023-03-30T10:22:06.897+08:00  INFO 20840 --- [           main] org.example.MainApplication              : Started MainApplication in 6.435 seconds (process running for 7.085)
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.apache.rocketmq.client.producer.DefaultMQProducer' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1148)
    at org.example.MainApplication.main(MainApplication.java:21)

old gradle config, it work normal

plugins {
    id 'org.springframework.boot' version '2.6.7'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id("java")
}

group = "org.example"
version = "1.0-SNAPSHOT"
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2021.0.2")
}
yuluo-yx commented 1 year ago

Can you provide relevant stack exception information, or a minimalist demo, so that the community can replicate and handle the problem!

build.gradle

plugins {
    id 'org.springframework.boot' version '3.0.2'
    id 'io.spring.dependency-management' version '1.1.0'
    id("java")
}

group = "org.example"
version = "1.0-SNAPSHOT"
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2022.0.1")
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-aop")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.cloud:spring-cloud-stream")
    implementation("org.springframework.cloud:spring-cloud-starter")
    implementation("org.springframework.cloud:spring-cloud-stream-binder-rocketmq:0.9.0.RELEASE")
}

dependencyManagement {
    imports {
        mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}")
    }
}

application.yml

spring:
  application:
    name: untitled
  cloud:
    stream:
      defaultBinder: rocketmq
      binders:
        rocketmq:
          type: rocketmq
      rocketmq:
        binder:
          name-server: dev1.rocketmq.leve.com:9876;dev2.rocketmq.leve.com:9876
          enable-msg-trace: false

Main Class

package org.example;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * ${NAME}
 *
 * @author zsh
 * @version 1.0.0
 * @date ${YEAR}/${MONTH}/${DAY} ${HOUR}:${MINUTE}
 */
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(MainApplication.class);
        ConfigurableApplicationContext applicationContext = application.run(args);
        DefaultMQProducer defaultMQProducer = applicationContext.getBean(DefaultMQProducer.class);
    }
}

Error log

2023-03-30T10:22:06.897+08:00  INFO 20840 --- [           main] org.example.MainApplication              : Started MainApplication in 6.435 seconds (process running for 7.085)
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.apache.rocketmq.client.producer.DefaultMQProducer' available
  at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)
  at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
  at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1148)
  at org.example.MainApplication.main(MainApplication.java:21)

old gradle config, it work normal

plugins {
    id 'org.springframework.boot' version '2.6.7'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id("java")
}

group = "org.example"
version = "1.0-SNAPSHOT"
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2021.0.2")
}

ok! I reproduced your problem locally, and I found that when I upgraded the spring cloud version to 2022.0.2, it worked without changing the spring boot version! If you change the spring boot version, it will fail to run. I have reported this to the spring boot community. Related issues:https://github.com/spring-projects/spring-boot/issues/34825

yuluo-yx commented 1 year ago

Alternatively, you can temporarily fix the problem by writing the following configuration bean

@Bean
public DefaultMQProducer getRockerMQBean() throws ClassNotFoundException, InstantiationException, IllegalAccessException {

    return (DefaultMQProducer) Class.forName("org.apache.rocketmq.client.producer.DefaultMQProducer").newInstance();
}
yuluo-yx commented 1 year ago

This component is not currently available for Spring Boot 3.0. There are some differences between Spring Boot2.x and 3.x auto injection!