Describe the bug Setting both org.springframework.cloud:spring-cloud-bus and org.springframework.cloud:spring-cloud-starter-stream-kafka as dependency for a spring boot application and configuring cloud bus and multiple kafka binders with custom environment settings the following exception is thrown during startup:
g.springframework.context.ApplicationContextException: Failed to start bean 'inputBindingLifecycle'; nested exception is java.lang.IllegalStateException: org.springframework.context.annotation.AnnotationConfigApplicationContext@4fd74223 has not been refreshed yet at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.4.jar:5.3.4] at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_211] at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:934) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:585) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) [spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) [spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) [spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) [spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) [spring-boot-2.4.3.jar:2.4.3] at my.projects.apps.NotificationApplication.main(NotificationApplication.java:10) [main/:na] Caused by: java.lang.IllegalStateException: org.springframework.context.annotation.AnnotationConfigApplicationContext@4fd74223 has not been refreshed yet at org.springframework.context.support.AbstractApplicationContext.assertBeanFactoryActive(AbstractApplicationContext.java:1140) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.AbstractApplicationContext.getBeanProvider(AbstractApplicationContext.java:1182) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.cloud.context.restart.RestartEndpoint.onApplicationEvent(RestartEndpoint.java:95) ~[spring-cloud-context-3.0.1.jar:3.0.1] at org.springframework.cloud.context.restart.RestartEndpoint.onApplicationEvent(RestartEndpoint.java:53) ~[spring-cloud-context-3.0.1.jar:3.0.1] at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:420) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:377) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.cloud.stream.binder.DefaultBinderFactory$1.onApplicationEvent(DefaultBinderFactory.java:294) ~[spring-cloud-stream-3.1.1.jar:3.1.1] at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.boot.context.event.EventPublishingRunListener.contextLoaded(EventPublishingRunListener.java:100) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplicationRunListeners.lambda$contextLoaded$4(SpringApplicationRunListeners.java:71) ~[spring-boot-2.4.3.jar:2.4.3] at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_211] at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:117) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:111) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplicationRunListeners.contextLoaded(SpringApplicationRunListeners.java:71) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:414) [spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:325) [spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:144) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.cloud.stream.binder.DefaultBinderFactory.getBinderInstance(DefaultBinderFactory.java:326) ~[spring-cloud-stream-3.1.1.jar:3.1.1] at org.springframework.cloud.stream.binder.DefaultBinderFactory.doGetBinder(DefaultBinderFactory.java:215) ~[spring-cloud-stream-3.1.1.jar:3.1.1] at org.springframework.cloud.stream.binder.DefaultBinderFactory.getBinder(DefaultBinderFactory.java:143) ~[spring-cloud-stream-3.1.1.jar:3.1.1] at org.springframework.cloud.stream.binding.BindingService.getBinder(BindingService.java:379) ~[spring-cloud-stream-3.1.1.jar:3.1.1] at org.springframework.cloud.stream.binding.BindingService.bindConsumer(BindingService.java:102) ~[spring-cloud-stream-3.1.1.jar:3.1.1] at org.springframework.cloud.stream.binding.AbstractBindableProxyFactory.createAndBindInputs(AbstractBindableProxyFactory.java:112) ~[spring-cloud-stream-3.1.1.jar:3.1.1] at org.springframework.cloud.stream.binding.InputBindingLifecycle.doStartWithBindable(InputBindingLifecycle.java:58) ~[spring-cloud-stream-3.1.1.jar:3.1.1] at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) ~[na:1.8.0_211] at org.springframework.cloud.stream.binding.AbstractBindingLifecycle.start(AbstractBindingLifecycle.java:57) ~[spring-cloud-stream-3.1.1.jar:3.1.1] at org.springframework.cloud.stream.binding.InputBindingLifecycle.start(InputBindingLifecycle.java:34) ~[spring-cloud-stream-3.1.1.jar:3.1.1] at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.4.jar:5.3.4] ... 15 common frames omitted
Sample
gradle.build:
buildscript {
dependencies {
classpath group: 'io.spring.gradle', name: 'dependency-management-plugin', version: '1.0.11.RELEASE'
classpath group: 'org.springframework.boot', name: 'spring-boot-gradle-plugin', version: '2.4.3'
}
}
dependencyManagement {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.4.3"
mavenBom "org.springframework.cloud:spring-cloud-dependencies:2020.0.1"
}
}
dependencies {
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator'
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-mail'
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web'
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-config'
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-bus-kafka'
}
application.yaml:
spring:
cloud:
discovery:
enabled: false
bus:
enabled: true
trace:
enabled: false
destination: my-cloud-bus-local
id: my-config-server
refresh:
enabled: true
env:
enabled: true
function:
definition: myEventConsumer
stream:
bindings:
my-cloud-bus:
destination: my-cloud-bus-local
binder: kafka-bus-message
myEventConsumer-in-0:
destination: event-message-local
binder: kafka-event-message
binders:
kafka-bus-message:
type: kafka
environment:
spring:
cloud:
stream:
kafka:
binder:
brokers: localhost
configuration:
"[security.protocol]": Plaintext
kafka-event-message:
type: kafka
environment:
spring:
cloud:
stream:
kafka:
binder:
brokers: localhost
configuration:
"[security.protocol]": Plaintext
Comment From: gelluszi
If I drop/comment the environment settings from the Kafka binders the application will start and use the default Kafka environment settings:
binders:
kafka-bus-message:
type: kafka
kafka-event-message:
type: kafka
Comment From: gelluszi
Checking some earlier spring boot and spring cloud versions I found the above problem is not present if I set the following versions:
springBootVersion = '2.4.0-M3'
springCloudVersion = '2020.0.0-M4'
However, the following new error message is logged (it's not blocking my actual task):
2021-03-05 15:57:44.343 INFO 32392 --- [pool-4-thread-1] i.m.c.i.binder.kafka.KafkaMetrics : Failed to bind meter: kafka.consumer.fetch.manager.records.consumed.total [tag(client-id=consumer-anonymous.7c914275-a40a-4cf6-9568-ee7938448ff6-4), tag(topic=iss-cloud-bus-local), tag(kafka-version=2.6.0), tag(spring.id=my-cloud-bus-local.consumer.consumer-anonymous.7c914275-a40a-4cf6-9568-ee7938448ff6-4)]. However, this could happen and might be restored in the next refresh.
Right after the startup, these kinds of logs disappear.
Comment From: gelluszi
The issue has been moved to spring-cloud-stream-binder-kafka project: https://github.com/spring-cloud/spring-cloud-stream-binder-kafka/issues/1049