我有一个使用spring-kafka和kafka-streams的Java Spring Boot应用程序. 我正在try 构建GraalVM本机映像,

 mvn -Pnative spring-boot:build-image

构建成功,但当我try 在docker中运行映像时,出现异常:

Caused by: org.apache.kafka.common.config.ConfigException: Invalid value org.apache.kafka.streams.processor.internals.DefaultKafkaClientSupplier for configuration default.client.supplier: Class org.apache.kafka.streams.processor.internals.DefaultKafkaClientSupplier could not be found.
        at org.apache.kafka.common.config.ConfigDef.parseType(ConfigDef.java:747)
        at org.apache.kafka.common.config.ConfigDef$ConfigKey.<init>(ConfigDef.java:1175)
        at org.apache.kafka.common.config.ConfigDef.define(ConfigDef.java:155)
        at org.apache.kafka.common.config.ConfigDef.define(ConfigDef.java:175)
        at org.apache.kafka.common.config.ConfigDef.define(ConfigDef.java:214)
        at org.apache.kafka.common.config.ConfigDef.define(ConfigDef.java:376)
        at org.apache.kafka.common.config.ConfigDef.define(ConfigDef.java:389)
        at org.apache.kafka.streams.StreamsConfig.<clinit>(StreamsConfig.java:1008)
        ... 16 common frames omitted

卡夫卡配置:

spring:
  kafka:
    producer:
      value-serializer: "org.springframework.kafka.support.serializer.JsonSerializer"
      properties:
        spring:
          json:
            type:
              mapping: "ErrorReportDomain:com.kt.kafka.messagingprocessor.domain.ErrorReportDomain"
    client-id: messaging-processor
    bootstrap-servers:
      - "XXX"
    security:
      protocol: SASL_PLAINTEXT
    properties:
      sasl:
        mechanism: SCRAM-SHA-512
        jaas:
          config: org.apache.kafka.common.security.scram.ScramLoginModule required username="XXX" password="XXX";
    streams:
      application.id: messaging-processor
      properties:
        spring:
          json:
            trusted:
              packages: '*'
        default:
          key:
            serde: org.apache.kafka.common.serialization.Serdes$StringSerde
          value:
            serde: org.springframework.kafka.support.serializer.JsonSerde

有什么建议吗?

推荐答案

我们最近在GraalVM可达性元数据中添加了Kafka Streams提示:https://github.com/oracle/graalvm-reachability-metadata/pull/422.

但显然,这一消息尚未公布.

因此,要让它在你的应用程序中运行,你需要手动提供这些提示.

看起来您没有使用Spring Cloud Stream,所以我建议将这个类复制/粘贴到您的项目中:https://github.com/spring-cloud/spring-cloud-stream/blob/main/binders/kafka-binder/spring-cloud-stream-binder-kafka-streams/src/main/java/org/springframework/cloud/stream/binder/kafka/streams/aot/KafkaStreamsBinderRuntimeHints.java

可能需要做一些修改,删除特定于Spring Cloud Stream的条目.

查看有关手动提示注册的更多文档:https://docs.spring.io/spring-framework/reference/core/aot.html#aot.hints

Java相关问答推荐

Spring bootstrap @ Asmat注释与@ Routed

我可以在regex中的字符类中放置断言吗?

具有默认分支的JUnit代码覆盖率切换声明

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

Java WireMock定义存根在Cucumber并行执行的多线程测试中失败

流迭代列表<;对象>;上的NoSuchElementException

Java LocalTime.parse在本地PC上的Spring Boot中工作,但在Docker容器中不工作

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

如何使用SpringBoot中的可分页对整数作为字符串存储在数据库中时进行排序

由于 list 中的权限错误,Android未生成

由于在生成器模式中使用泛型,lambda表达式中的返回类型错误

如何创建模块信息类文件并将其添加到JAR中?

找出承载Cargo 的最小成本

将BlockingQueue+守护程序线程替换为执行器

如何设置默认序列生成器分配大小

如何通过gradle命令行从build.gradle获得Java targetCompatibility

如何在Selenium上继续使用最新的WebDriver版本

ResponseEntity.控制器截断响应的JSON部分

javax.crypto-密码对象-提供者服务是如何工作的?

从 Java 17 切换回 Java 8 后出现的问题