Java 如何使用Quarkus通过拓扑启动Kafka Streams管道

Java 如何使用Quarkus通过拓扑启动Kafka Streams管道,java,apache-kafka-streams,quarkus,Java,Apache Kafka Streams,Quarkus,我正在关注这个问题,不太明白如何启动管道 在本教程中,org.apache.kafka.streams.StreamsBuilder用于构建描述管道的org.apache.kafka.streams.Topology。构建拓扑的方法用@products注释。在本文中,描述了这足以运行Kafka Streams管道。在本教程中,还公开了http端点。这在我当前实现的服务中不是必需的。此外,在本例中,从未显式调用provider方法。当我在没有端点的情况下启动应用程序时,管道不会启动 在管道中使用拓

我正在关注这个问题,不太明白如何启动管道

在本教程中,
org.apache.kafka.streams.StreamsBuilder
用于构建描述管道的
org.apache.kafka.streams.Topology
。构建拓扑的方法用
@products
注释。在本文中,描述了这足以运行Kafka Streams管道。在本教程中,还公开了http端点。这在我当前实现的服务中不是必需的。此外,在本例中,从未显式调用provider方法。当我在没有端点的情况下启动应用程序时,管道不会启动

在管道中使用拓扑显式实例化。但是这里的属性必须手动设置,并且配置不是从
quarkus.kafka流中获取。
properties

问题是:如何使用第一个教程中的Topology builder启动它所描述的管道?最佳情况是自动应用来自
quarkus.kafka streams.
的配置

使用:

  • Java OpenJDK 11.0.8
  • Quarkus版本:1.8.0.最终版

    • 解决了问题:无法保证完全正确。只是想和大家分享解决我问题的方法

      最重要的是使用正确的
      @products
      javax.enterprise.inject.products
      必须用于
      拓扑
      生成方法
      javax.ws.rs.products
      还可用于定义输出的MediaType,但不是强制性的:

      
          @javax.ws.rs.Produces( MediaType.TEXT_PLAIN )
          @Produces
          @AlternativePriority( 1 )
          public Topology buildTopology() {
              ...
          }
      
      Kafka Streams
      的实例在启动时由框架自动构建。运行管道所需的全部内容如下:

      
      @ApplicationScoped
      public class YourApplication {
          private final KafkaStreams streams;
      
          public NasDistributorApplication( final KafkaStreams streams ) {
              this.streams = streams;
          }
      
          public void onStart( @Observes final StartupEvent startupEvent ) {
              streams.start();
          }
      
          public void onStop( @Observes final ShutdownEvent shutdownEvent ) {
              streams.close();
          }
      
      }
      
      

      通过
      @AlternativePriority(1)
      注释
      拓扑
      生成方法可能需要告诉
      quarkus
      使用此方法构建
      拓扑。我不知道框架的内部结构,但我怀疑使用了默认拓扑,并且
      @AlternativePriority
      赋予自定义方法比默认
      拓扑更高的优先级,这解决了问题:无法保证完全正确。只是想和大家分享解决我问题的方法

      最重要的是使用正确的
      @products
      javax.enterprise.inject.products
      必须用于
      拓扑
      生成方法
      javax.ws.rs.products
      还可用于定义输出的MediaType,但不是强制性的:

      
          @javax.ws.rs.Produces( MediaType.TEXT_PLAIN )
          @Produces
          @AlternativePriority( 1 )
          public Topology buildTopology() {
              ...
          }
      
      Kafka Streams
      的实例在启动时由框架自动构建。运行管道所需的全部内容如下:

      
      @ApplicationScoped
      public class YourApplication {
          private final KafkaStreams streams;
      
          public NasDistributorApplication( final KafkaStreams streams ) {
              this.streams = streams;
          }
      
          public void onStart( @Observes final StartupEvent startupEvent ) {
              streams.start();
          }
      
          public void onStop( @Observes final ShutdownEvent shutdownEvent ) {
              streams.close();
          }
      
      }
      
      
      通过
      @AlternativePriority(1)
      注释
      拓扑
      生成方法可能需要告诉
      quarkus
      使用此方法构建
      拓扑。我不知道框架的内部结构,但我怀疑使用了默认拓扑,并且
      @AlternativePriority
      赋予自定义方法比默认
      拓扑更高的优先级