Azure/azure-sdk-for-java

[BUG] Failed to create consumer binding;when creating Spring-Cloud-Stream project with ServiceBus binder

vyom-soft opened this issue · 4 comments

Hello,

Could you please see the issue;
I am following the sample proposed by azure.
https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/servicebus/azure-spring-cloud-stream-binder-servicebus-topic/servicebus-topic-binder

I get this exception
ServiceBus processor client startup failed, Caused by null; nested exception is java.lang.NullPointerException
defined in null: Cannot register bean definition [Root bean: class [org.springframework.integration.handler.advice.ErrorMessageSendingRecoverer]

Exception or Stack Trace

2021-09-09 17:09:45.754 ERROR 43532 --- [  restartedMain] c.a.s.i.s.topic.ServiceBusTopicTemplate  : ServiceBus processorClient startup failed, Caused by null
2021-09-09 17:09:52.637 ERROR 43532 --- [  restartedMain] o.s.cloud.stream.binding.BindingService  : Failed to create consumer binding; retrying in 30 seconds

org.springframework.cloud.stream.binder.BinderException: Exception thrown while starting consumer: 
	at org.springframework.cloud.stream.binder.AbstractMessageChannelBinder.doBindConsumer(AbstractMessageChannelBinder.java:462) ~[spring-cloud-stream-3.1.3.jar:3.1.3]
	at org.springframework.cloud.stream.binder.AbstractMessageChannelBinder.doBindConsumer(AbstractMessageChannelBinder.java:91) ~[spring-cloud-stream-3.1.3.jar:3.1.3]
	at org.springframework.cloud.stream.binder.AbstractBinder.bindConsumer(AbstractBinder.java:143) ~[spring-cloud-stream-3.1.3.jar:3.1.3]
	at org.springframework.cloud.stream.binding.BindingService.doBindConsumer(BindingService.java:177) ~[spring-cloud-stream-3.1.3.jar:3.1.3]
	at org.springframework.cloud.stream.binding.BindingService.bindConsumer(BindingService.java:134) ~[spring-cloud-stream-3.1.3.jar:3.1.3]
	at org.springframework.cloud.stream.binding.AbstractBindableProxyFactory.createAndBindInputs(AbstractBindableProxyFactory.java:118) ~[spring-cloud-stream-3.1.3.jar:3.1.3]
	at org.springframework.cloud.stream.binding.InputBindingLifecycle.doStartWithBindable(InputBindingLifecycle.java:58) ~[spring-cloud-stream-3.1.3.jar:3.1.3]
	at java.base/java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:647) ~[na:na]
	at org.springframework.cloud.stream.binding.AbstractBindingLifecycle.start(AbstractBindingLifecycle.java:57) ~[spring-cloud-stream-3.1.3.jar:3.1.3]
	at org.springframework.cloud.stream.binding.InputBindingLifecycle.start(InputBindingLifecycle.java:34) ~[spring-cloud-stream-3.1.3.jar:3.1.3]
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.9.jar:5.3.9]
	at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.9.jar:5.3.9]
	at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.9.jar:5.3.9]
	at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
	at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.9.jar:5.3.9]
	at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.9.jar:5.3.9]
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.9.jar:5.3.9]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.9.jar:5.3.9]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.5.4.jar:2.5.4]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-2.5.4.jar:2.5.4]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-2.5.4.jar:2.5.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:338) ~[spring-boot-2.5.4.jar:2.5.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.4.jar:2.5.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.4.jar:2.5.4]
	at de.vyom.servicebus.ServiceBusApplication.main(ServiceBusApplication.java:27) ~[classes/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
	at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.5.4.jar:2.5.4]
Caused by: com.azure.spring.integration.servicebus.ServiceBusRuntimeException: ServiceBus processor client startup failed, Caused by null; nested exception is java.lang.NullPointerException
	at com.azure.spring.integration.servicebus.topic.ServiceBusTopicTemplate.internalSubscribe(ServiceBusTopicTemplate.java:121) ~[azure-spring-integration-servicebus-2.8.0.jar:na]
	at com.azure.spring.integration.servicebus.topic.ServiceBusTopicTemplate.subscribe(ServiceBusTopicTemplate.java:71) ~[azure-spring-integration-servicebus-2.8.0.jar:na]
	at com.azure.spring.integration.core.api.SubscribeByGroupOperation.subscribe(SubscribeByGroupOperation.java:30) ~[azure-spring-integration-core-2.8.0.jar:na]
	at com.azure.spring.integration.core.AbstractInboundChannelAdapter.doStart(AbstractInboundChannelAdapter.java:43) ~[azure-spring-integration-core-2.8.0.jar:na]
	at org.springframework.integration.endpoint.AbstractEndpoint.start(AbstractEndpoint.java:157) ~[spring-integration-core-5.5.3.jar:5.5.3]
	at org.springframework.cloud.stream.binder.AbstractMessageChannelBinder.doBindConsumer(AbstractMessageChannelBinder.java:415) ~[spring-cloud-stream-3.1.3.jar:3.1.3]
	... 29 common frames omitted
Caused by: java.lang.NullPointerException: null
	at com.azure.spring.integration.servicebus.topic.ServiceBusTopicTemplate.internalSubscribe(ServiceBusTopicTemplate.java:114) ~[azure-spring-integration-servicebus-2.8.0.jar:na]
	... 34 common frames omitted

2021-09-09 17:09:52.678  INFO 43532 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-09-09 17:09:52.778  INFO 43532 --- [  restartedMain] d.vyom.servicebus.ServiceBusApplication  : Started ServiceBusApplication in 116.506 seconds (JVM running for 119.025)
2021-09-09 17:10:22.644  INFO 43532 --- [   scheduling-1] c.a.s.i.servicebus.ServiceBusTemplate    : ServiceBusTemplate checkpoint config becomes: CheckpointConfig{checkpointMode=MANUAL, checkpointCount=0, checkpointInterval=null}
2021-09-09 17:15:59.296  INFO 43532 --- [   scheduling-1] o.s.i.monitor.IntegrationMBeanExporter   : Registering MessageChannel exam-topic.tsubscription-one.errors
2021-09-09 17:15:59.306 ERROR 43532 --- [   scheduling-1] o.s.cloud.stream.binding.BindingService  : Failed to create consumer binding; retrying in 30 seconds

To Reproduce
Please follow the spring cloud stream Azure sample.
https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/servicebus/azure-spring-cloud-stream-binder-servicebus-topic/servicebus-topic-binder

Code Snippet

spring:
  cloud:
    azure:
      servicebus:
        connection-string: [sb://techem-broker.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=z2m+xtLp9D9r7l0dyXk9rEa4K3KXi7pKGjS4L4bhRj8=]
    stream:
      bindings:
        consume-in-0:
          destination: exam-topic
          group: tsubscription-one
        supply-out-0:
          destination: exam-topic
      servicebus:
        topic:
          bindings:
            consume-in-0:
              consumer:
                checkpoint-mode: MANUAL
      function:
        definition: consume;supply;
      poller:
        fixed-delay: 1000
        initial-delay: 0
  autoconfigure:
    exclude: com.azure.spring.cloud.autoconfigure.servicebus.AzureServiceBusQueueAutoConfiguration
  profiles:
    active: manual

Expected behavior
At leaset the given sample should run.

Setup (please complete the following information):

  • OS: [Ubuntu 21.04 (ubuntu-latest)]
  • IDE: IntelliJ Ultimate
  • Library/Libraries: [
   <parent>
   	<groupId>org.springframework.boot</groupId>
   	<artifactId>spring-boot-starter-parent</artifactId>
   	<version>2.5.4</version>
   	<relativePath/> 
   </parent>
   <groupId>de.vyom</groupId>
   <artifactId>servicebus</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>servicebus</name>
   <description>Demo project for Spring Boot</description>
   <properties>
   	<java.version>11</java.version>
   	<azure.version>3.6.1</azure.version>
   	<spring-cloud.version>2020.0.3</spring-cloud.version>
   	<testcontainers.version>1.15.3</testcontainers.version>
   </properties>
   <dependencies>
   	<dependency>
   		<groupId>org.springframework.boot</groupId>
   		<artifactId>spring-boot-starter-web</artifactId>
   	</dependency>
   	<dependency>
   		<groupId>com.azure.spring</groupId>
   		<artifactId>azure-spring-cloud-stream-binder-servicebus-topic</artifactId>
   		<version>2.8.0</version>
   	</dependency>
   	<dependency>
   		<groupId>com.azure.spring</groupId>
   		<artifactId>azure-spring-boot-starter</artifactId>
   	</dependency>
   	<dependency>
   		<groupId>org.springframework.cloud</groupId>
   		<artifactId>spring-cloud-stream</artifactId>
   	</dependency>
   	<dependency>
   		<groupId>org.springframework.boot</groupId>
   		<artifactId>spring-boot-starter-logging</artifactId>
   	</dependency>
   	<dependency>
   		<groupId>org.springframework.boot</groupId>
   		<artifactId>spring-boot-devtools</artifactId>
   		<scope>runtime</scope>
   		<optional>true</optional>
   	</dependency>
   	<dependency>
   		<groupId>org.projectlombok</groupId>
   		<artifactId>lombok</artifactId>
   		<optional>true</optional>
   	</dependency>
   </dependencies>
   <dependencyManagement>
   	<dependencies>
   		<dependency>
   			<groupId>org.springframework.cloud</groupId>
   			<artifactId>spring-cloud-dependencies</artifactId>
   			<version>2020.0.3</version>
   			<type>pom</type>
   			<scope>import</scope>
   		</dependency>
   		<dependency>
   			<groupId>com.azure.spring</groupId>
   			<artifactId>azure-spring-boot-bom</artifactId>
   			<version>3.6.1</version>
   			<type>pom</type>
   			<scope>import</scope>
   		</dependency>
   	</dependencies>
   </dependencyManagement>
</project>

]

  • Java version: [11]
  • App Server/Environment: [ Tomcat]
  • Frameworks: [Spring Cloud Stream, Spring Boot]

Additional context application.yaml

spring:
  cloud:
    azure:
      servicebus:
        connection-string: [sb://vyomsoft-broker.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=g5u+mtPp9H9r3l0dyXk9rEb3K3WXi2pNGsT4L4bhZc9=]
    stream:
      bindings:
        consume-in-0:
          destination: exam-topic
          group: tsubscription-one
        supply-out-0:
          destination: exam-topic
      servicebus:
        topic:
          bindings:
            consume-in-0:
              consumer:
                checkpoint-mode: MANUAL
      function:
        definition: consume;supply;
      poller:
        fixed-delay: 1000
        initial-delay: 0
  autoconfigure:
    exclude: com.azure.spring.cloud.autoconfigure.servicebus.AzureServiceBusQueueAutoConfiguration
  profiles:
    active: manual

Thank you.

@yiliuTo could you please follow up with @vyom-soft

Hi @vyom-soft , could you try with using another format of connection-string?

Your current format is [sb://techem-broker.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=z2m+xtLp9D9r7l0dyXk9rEa4K3KXi7pKGjS4L4bhRj8=], you can replace it as Endpoint=sb://techem-broker.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=z2m+xtLp9D9r7l0dyXk9rEa4K3KXi7pKGjS4L4bhRj8=. I just reproduce and resolve your issue by the above solution.

Hi @vyom-soft , could you try with using another format of connection-string?

Your current format is [sb://techem-broker.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=z2m+xtLp9D9r7l0dyXk9rEa4K3KXi7pKGjS4L4bhRj8=],
you can replace it as
Endpoint=sb://techem-broker.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=z2m+xtLp9D9r7l0dyXk9rEa4K3KXi7pKGjS4L4bhRj8=. I just reproduce and resolve your issue by the above solution.

Hi @yiliuTo 👍 Thank you for verifying the issue.
I confirm that after I adapted the signature for connection-string as mentioned in your reply. The error is no longer seen.
Please close the issue.

I have a query.
After the consume function has read from the topic; Is it possible to call a Rest endpoint.