Skip to content

Conversation

@k-antonov
Copy link

При локальном запуске CDC-процессора, как часть нашего приложения (не отдельный jar) вижу исключения:

java.lang.IllegalThreadStateException: null
  at java.base/java.lang.Thread.start(Thread.java:800)
  at YqlWriter$Writer.start(YqlWriter.java:88)
  at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  at YqlWriter.start(YqlWriter.java:52)
  at CdcReader.start(CdcReader.java:52)
  at CdcService.loadXmlConfig(CdcService.java:83)
  at CdcService.execute(CdcService.java:58)
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.base/java.lang.reflect.Method.invoke(Method.java:569)
  at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:348)
  at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:233)
  at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:165)
  at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
  at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
  at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
  at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:437)
  at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:370)
  at org.springframework.boot.context.event.EventPublishingRunListener.ready(EventPublishingRunListener.java:109)
  at org.springframework.boot.SpringApplicationRunListeners.lambda$ready$6(SpringApplicationRunListeners.java:80)
  at java.base/java.lang.Iterable.forEach(Iterable.java:75)
  at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118)
  at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:112)
  at org.springframework.boot.SpringApplicationRunListeners.ready(SpringApplicationRunListeners.java:80)
  at org.springframework.boot.SpringApplication.run(SpringApplication.java:331)
  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)
  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)

CdcService - замена оригинального класса Application для чтения конфигов по определенному пути в файлах проекта, а не из аргументов CLI. Не очень хорошо разбираюсь в многопоточке, но похоже это исключение появляется при попытке запустить уже запущенный поток. Предлагаю добавить синхронизацию и флаг running.

  1. synchronized(lock) не позволит случиться race condition, при котором может быть повторно вызван thread.start()
  2. кажется, что одной лишь проверки thread.isAlive() недостаточно - после thread.interrupt() поток завершается не сразу, нативное состояние всё еще может быть isAlive() == true, а логически он уже не должен считаться активным.

При внесении изменений исключения больше не появляются.

@alex268 alex268 merged commit 38055a0 into ydb-platform:master Jun 8, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants