Jdbc.sink.error Произошла непредвиденная ошибка: java.lang.NoClassDefFoundError: не удалось инициализировать класс io.confluent.connect.jdbc.sink.JdbcSinkConfig

Платформа Confluent добавляет изображение соединителя раковины

При попытке добавить соединитель приемника в слитную платформу возникают ошибки.

Соединитель устанавливается вручную -- confluent-hub install confluentinc/kafka-connect-jdbc:10.7.6

{
"class": "io.confluent.connect.jdbc.JdbcSinkConnector",
"type": "sink",
"version": "10.7.6"
},
{
"class": "io.confluent.connect.jdbc.JdbcSourceConnector",
"type": "source",
"version": "10.7.6"
}

исходный разъем работает правильно, слитный пользовательский интерфейс не выдает никаких ошибок.

Я использую локально Confluent 10.7.4.-confluent версии v3.2.1.

Java-версия-- openjdk 11.0.22 16.01.2024 Среда выполнения OpenJDK OpenLogic-OpenJDK (сборка 11.0.22+7-adhoc.admin.jdk11u) 64-разрядная серверная виртуальная машина OpenJDK OpenLogic-OpenJDK (сборка 11.0.22+7-adhoc.admin.jdk11u, смешанный режим)

Ошибка в журнале подключений

ERROR Uncaught exception in REST call to /connector plugins/io.confluent.connect.jdbc.JdbcSinkConnector/config/validate (org.apache.kafka.connect.runtime.rest.errors.ConnectExceptionMapper:64)
java.util.concurrent.ExecutionException: java.lang.ExceptionInInitializerError
at org.apache.kafka.connect.util.ConvertingFutureCallback.result(ConvertingFutureCallback.java:123)
at org.apache.kafka.connect.util.ConvertingFutureCallback.get(ConvertingFutureCallback.java:115)
at org.apache.kafka.connect.runtime.rest.resources.ConnectorPluginsResource.validateConfigs(ConnectorPluginsResource.java:109)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:134)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:177)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:219)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:81)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:475)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:397)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:255)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:234)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684)
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:358)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:311)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:554)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:234)
at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:181)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.Server.handle(Server.java:516)
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
at java.base/java.lang.Thread.run(Thread.java:829)

Caused by: java.lang.ExceptionInInitializerError
at io.confluent.connect.jdbc.JdbcSinkConnector.config(JdbcSinkConnector.java:70)
at org.apache.kafka.connect.runtime.AbstractHerder.validateConnectorConfig(AbstractHerder.java:580)
at org.apache.kafka.connect.runtime.AbstractHerder.lambda$validateConnectorConfig$6(AbstractHerder.java:470)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
... 1 more

Caused by: org.apache.kafka.common.config.ConfigException: Invalid value insert for configuration insert.mode: Invalid enumerator
at io.confluent.connect.jdbc.sink.JdbcSinkConfig$EnumValidator.ensureValid(JdbcSinkConfig.java:658)
at org.apache.kafka.common.config.ConfigDef$ConfigKey.<init>(ConfigDef.java:1270)
at org.apache.kafka.common.config.ConfigDef.define(ConfigDef.java:159)
at org.apache.kafka.common.config.ConfigDef.define(ConfigDef.java:179)
at org.apache.kafka.common.config.ConfigDef.define(ConfigDef.java:218)
at io.confluent.connect.jdbc.sink.JdbcSinkConfig.<clinit>(JdbcSinkConfig.java:362)
... 8 more

В чем проблема ?

Можете ли вы вернуться к журналу и посмотреть, сможете ли вы найти ExceptionInInitializerError? Если можете, это должно указать вам настоящую причину ошибки. Знак NoClassDefFoundError с сообщением Could not initialize class .... означает, что JVM уже пыталась выполнить статическую инициализацию этого класса, но ей это не удалось, поэтому она не пытается повторить эту попытку.

Luke Woodward 10.04.2024 22:05

Спасибо за комментарий @LukeWoodward ERROR Uncaught exception in REST call to /connector-plugins/io.confluent.connect.jdbc.JdbcSinkConnect‌​or/config/validate (org.apache.kafka.connect.runtime.rest.errors.ConnectExcepti‌​onMapper:64) java.util.concurrent.ExecutionException: java.lang.ExceptionInInitializerError Думаю, это та же ошибка, когда я пытаюсь добавить соединитель в слитном Центре управления. Также я пытаюсь использовать ошибку команды (-X POST): {"servlet":"org.glassfish.jersey.servlet.ServletContainer-7d‌​5f8007", "message":"Request failed.","url":"/connectors","status":"500"}

MoonStar 11.04.2024 09:00

Пожалуйста, отредактируйте свой вопрос и включите полную трассировку стека исключения с помощью ExceptionInInitializerError. Вы не опубликовали полную трассировку стека в своем комментарии, но кажется, что то, что вы опубликовали, заканчивается до того, как появится полезная информация.

Luke Woodward 12.04.2024 23:38

Спасибо @LukeWoodward. Я отредактировал и добавил полные журналы ExceptionInInitializerError.

MoonStar 13.04.2024 03:08

Спасибо. Я первоначально рассмотрел исключение основной причины (то, что справа внизу), но не увидел очевидного способа его запуска. Я буду продолжать изучать это.

Luke Woodward 14.04.2024 12:25

Я еще раз посмотрел на это и не могу воспроизвести проблему. Однако я только что вспомнил проблему, которая затронула аналогичный вопрос. Вы случайно не используете турецкую локаль?

Luke Woodward 14.04.2024 13:13

Большое спасибо @LukeWoodward. Я решаю это с помощью изменения языка моей системы.

MoonStar 14.04.2024 22:01
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
1
7
145
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ошибка в Confluent JDBC Connector. Ему не удается инициализироваться, если он запускается в турецкой локали.

Ошибка заключается в этом методе:

    public static <E> EnumValidator in(E[] enumerators) {
      final List<String> canonicalValues = new ArrayList<>(enumerators.length);
      final Set<String> validValues = new HashSet<>(enumerators.length * 2);
      for (E e : enumerators) {
        canonicalValues.add(e.toString().toLowerCase());
        validValues.add(e.toString().toUpperCase());
        validValues.add(e.toString().toLowerCase());
      }
      return new EnumValidator(canonicalValues, validValues);
    }

Проблема в том, что вызовы .toLowerCase() и .toUpperCase() не указывают локаль, в которой они выполняют преобразование регистра. Таким образом, преобразование происходит в локали по умолчанию. Для конфигурации insert.mode по умолчанию допустимыми значениями являются имена перечисления InsertMode (INSERT, UPSERT и UPDATE), а также их значения в нижнем регистре. В турецком языке это ınsert, upsert и update.

Класс JdbcSinkConfig содержит некоторые функции для проверки правильности всех значений конфигурации по умолчанию. Параметр insert.mode — это один из параметров конфигурации, значение которого проверяется. Значение по умолчанию для insert.modeinsert. Конечно, в турецкой локали это не одно из допустимых значений, поэтому выдается исключение.

Если у вас есть возможность использовать английский язык вместо турецкого, я ожидаю, что все будет работать. Если нет, вы ждете, что Confluent исправит эту ошибку. Я сообщил об этой ошибке в их репозитории на GitHub здесь.

Спасибо за ваши усилия @LukeWoodward. Вы можете решить эту проблему, изменив местный язык.

MoonStar 14.04.2024 22:03

Другие вопросы по теме

Похожие вопросы