Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Application fails to start in dev mode if kafka-streams extension is present #41432

Closed
fedinskiy opened this issue Jun 25, 2024 · 4 comments · Fixed by #46576
Closed

Application fails to start in dev mode if kafka-streams extension is present #41432

fedinskiy opened this issue Jun 25, 2024 · 4 comments · Fixed by #46576
Milestone

Comments

@fedinskiy
Copy link
Contributor

Describe the bug

I have an application, which contains kafka-streams dependency. When I start the application in a dev mode, it fails with UnsatisfiedResolutionException in Quarkus code.

Expected behavior

Application shouldn't fail, or should tell user, that must be fixed in the application/configs/environment.

Actual behavior

2024-06-25 16:01:33,700 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
	[error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
	- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
	- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
	at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1529)
	at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:332)
	at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:166)
	at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849)
	at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
	at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
	at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
	at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
	at java.base/java.lang.Thread.run(Thread.java:1583)
	at org.jboss.threads.JBossThread.run(JBossThread.java:483)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
	- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
	- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
	at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:519)
	at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:642)
	at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:317)
	... 12 more

	at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:331)
	at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:252)
	at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:58)
	at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:113)
	at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:435)
	at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:56)
	at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:138)
	at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:93)
	at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131)
	at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62)
Caused by: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
	[error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
	- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
	- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
	at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1529)
	at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:332)
	at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:166)
	at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849)
	at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
	at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
	at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
	at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
	at java.base/java.lang.Thread.run(Thread.java:1583)
	at org.jboss.threads.JBossThread.run(JBossThread.java:483)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
	- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
	- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
	at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:519)
	at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:642)
	at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:317)
	... 12 more

	at io.quarkus.builder.Execution.run(Execution.java:123)
	at io.quarkus.builder.BuildExecutionBuilder.execute(BuildExecutionBuilder.java:79)
	at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:160)
	at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:327)
	... 9 more
Caused by: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
	- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
	- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
	at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1529)
	at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:332)
	at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:166)
	at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849)
	at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
	at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
	at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
	at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
	at java.base/java.lang.Thread.run(Thread.java:1583)
	at org.jboss.threads.JBossThread.run(JBossThread.java:483)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
	- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
	- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
	at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:519)
	at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:642)
	at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:317)
	... 12 more

How to Reproduce?

  1. Create the app: wget -O app.zip 'https://code.quarkus.io/d?e=rest&e=kafka-streams&e=messaging-kafka&cn=code.quarkus.io'
  2. Unpack it: unzip -q app.zip && cd code-with-quarkus/
  3. mvn quarkus:dev

If the app is built and run in prod mode, it starts without any problem:
4. mvn clean install && java -jar target/quarkus-app/quarkus-run.jar
If the kafka-streams is removed, the app works in dev mode as well:
3. quarkus extension remove kafka-streams
4. mvn quarkus:dev

Output of uname -a or ver

6.7.3-200.fc39.x86_64

Output of java -version

Java version: 21.0.1, vendor: Eclipse Adoptium

Quarkus version or git rev

3.11.3

Build tool (ie. output of mvnw --version or gradlew --version)

Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)

Additional information

No response

Copy link

quarkus-bot bot commented Jun 25, 2024

/cc @alesj (kafka,kafka-streams), @cescoffier (kafka), @gunnarmorling (kafka-streams), @ozangunalp (kafka,kafka-streams), @rquinio (kafka-streams)

@rquinio
Copy link
Contributor

rquinio commented Jun 25, 2024

@fedinskiy You need to produce a bean of type org.apache.kafka.streams.Topology, for instance https://github.com/quarkusio/quarkus-quickstarts/blob/4741f553ce3f2b3ee8549816a7cba4eca0931f68/kafka-streams-quickstart/aggregator/src/main/java/org/acme/kafka/streams/aggregator/streams/TopologyProducer.java#L33

There's the extension https://github.com/quarkiverse/quarkus-kafka-streams-processor that will automatically produce a Topology based on configuration, but it's limited to simple Processors.

@fedinskiy
Copy link
Contributor Author

@rquinio thank you for your advice! Is it possible to have this as a dev mode error instead of UnsatisfiedResolutionException?
Also:

  1. For prod mode it's just a warning, not an error. Is this intended?
  2. Maybe we should have some kind of example topology in autogenerated (via cli and code.quarkus ) apps as well.

@dcotfr
Copy link
Contributor

dcotfr commented Feb 28, 2025

See #46576 for a fix proposal

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants