My consumer works with following configuration in tests
@Bean
public Function<Flux<Message<Map<String, Object>>>, Mono<Void>> handle() {
...
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@EmbeddedKafka(
brokerProperties = {"listeners=PLAINTEXT://localhost:22092"},
topics = {"alm-theapp-theenv"},
partitions = 1
)
@TestPropertySource(
properties = {
...
"spring.cloud.function.definition=handle",
"spring.cloud.stream.binder.autoCreateTopics=false",
"spring.cloud.stream.default.producer.useNativeEncoding=true",
"spring.cloud.stream.default.consumer.useNativeDecoding=true",
"spring.cloud.stream.bindings.handle-in-0.destination=alm-${app}-${runtimeEnv}",
"spring.cloud.stream.bindings.handle-in-0.group=${category}-${spring.application.name}-consumer-${runtimeEnv}",
"spring.cloud.stream.kafka.binder.brokers=localhost:22092",
"spring.cloud.stream.kafka.binder.producerProperties.key.serializer=org.apache.kafka.common.serialization.StringSerializer",
"spring.cloud.stream.kafka.binder.producerProperties.value.serializer=org.springframework.kafka.support.serializer.JsonSerializer",
"spring.cloud.stream.kafka.default.consumer.configuration.key.deserializer=org.apache.kafka.common.serialization.StringDeserializer",
"spring.cloud.stream.kafka.default.consumer.configuration.value.deserializer=org.springframework.kafka.support.serializer.JsonDeserializer",
}
)
class ServiceTests {
...
@Test
@DisplayName("SHOULD execute webhook(s) matching the given trigger")
void testExecutesMatchedTriggersOnly() throws JsonProcessingException {
// Create message
...
boolean sent = streamBridge.send(handlerInTopic, "kafka", message);
await().until(() -> sent);
log.debug("Published Kafka Message at offset topic {}", handlerInTopic);
await().until(() -> mongoOperations.exists(Query.query(Criteria.where("webhookId").exists(true)), "webhooks_responses").block(Duration.ofMillis(1000)));
Assertions.assertFalse(mongoOperations.exists(Query.query(Criteria.where("webhookId").is(webhookResponse2.get("webhookId"))), "webhook_responses").block(), "SHOULD not execute webhook with ID " + webhookResponse2.get("webhookId"));
}
But the Deployed application keeps throwing
[KafkaConsumerDestination{consumerDestinationName='alm-theapp-dev', partitions=0, dlqName='null'}.container-0-C-1] 04 Oct 2022 04:11:25,773 1083069239069012 org.springframework.kafka.listener.DefaultErrorHandler - Backoff none exhausted for alm-theapp-dev-0@41906
org.springframework.kafka.listener.ListenerExecutionFailedException: Listener failed; nested exception is org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel 'howler-1.handle-in-0'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers, failedMessage=GenericMessage [payload=byte[1344], headers={X-FABRIC-CORRELATION=theappDEV:70051104:70052267, deliveryAttempt=3, kafka_timestampType=CREATE_TIME, kafka_receivedMessageKey=[B@27207d18, kafka_receivedTopic=alm-theapp-dev, target-protocol=kafka, kafka_offset=41906, scst_nativeHeadersPresent=true, kafka_consumer=org.apache.kafka.clients.consumer.KafkaConsumer@1152f5b8, source-type=kafka, kafka_receivedPartitionId=0, contentType=application/json, kafka_receivedTimestamp=1664856682765, kafka_groupId=fabric-howler-consumers-dev}], failedMessage=GenericMessage [payload=byte[1344], headers={X-FABRIC-CORRELATION=theappDEV:70051104:70052267, deliveryAttempt=3, kafka_timestampType=CREATE_TIME, kafka_receivedMessageKey=[B@27207d18, kafka_receivedTopic=alm-theapp-dev, target-protocol=kafka, kafka_offset=41906, scst_nativeHeadersPresent=true, kafka_consumer=org.apache.kafka.clients.consumer.KafkaConsumer@1152f5b8, source-type=kafka, kafka_receivedPartitionId=0, contentType=application/json, kafka_receivedTimestamp=1664856682765, kafka_groupId=fabric-howler-consumers-dev}]
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.decorateException(KafkaMessageListenerContainer.java:2707)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeOnMessage(KafkaMessageListenerContainer.java:2673)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeOnMessage(KafkaMessageListenerContainer.java:2633)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:2560)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeWithRecords(KafkaMessageListenerContainer.java:2441)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:2319)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:1990)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeIfHaveRecords(KafkaMessageListenerContainer.java:1366)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1357)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1252)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.lang.Thread.run(Thread.java:833)