Почему не работает корректное завершение работы асинхронного вызова SOAP-сервиса при получении сигнала SIGTERM

Рейтинг: 1Ответов: 1Опубликовано: 18.08.2023

Реализую корректное завершение SpringBoot приложения при получении команды SIGTERM. Задал настройки для SpringBoot:

server:
  shutdown: graceful

spring.task.execution:
  pool:
    allow-core-thread-timeout: true
    keep-alive: 3m
  shutdown:
    await-termination: true
    await-termination-period: 3m

А так же пробовал и через ThreadPoolTaskExecutor:

ThreadPoolTaskExecutor defaultExecutor = new ThreadPoolTaskExecutor();
    defaultExecutor.setKeepAliveSeconds(180);
    defaultExecutor.setWaitForTasksToCompleteOnShutdown(true);
    defaultExecutor.setAwaitTerminationSeconds(180);

Но столкнулся с проблемой. В асинхронном потоке вызывается SOAP метод и он падает с ошибкой:

ERROR [iso20022.app.FCR,3b58933b54e5e47c,1eb7da1d0650e9d9] 2808 --- [     h2h-async1] r.a.h.c.RepeaterInvocationHandler        : error on calling jdk.proxy6.$Proxy236.wsAccountBaseInfoGet
java.lang.ExceptionInInitializerError: null
    at com.sun.xml.ws.transport.http.client.HttpTransportPipe.getTransport(HttpTransportPipe.java:154) ~[jaxws-rt-2.3.1.jar:2.3.1]
…
Caused by: java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [META-INF/services/javax.xml.bind.JAXBContext]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1432)
at org.apache.catalina.loader.WebappClassLoaderBase.getResourceAsStream(WebappClassLoaderBase.java:1140)
at javax.xml.bind.ContextFinder.firstByServiceLoaderDeprecated(ContextFinder.java:620)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:408)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662)
at com.sun.xml.ws.transport.http.client.HttpClientTransport.<clinit>(HttpClientTransport.java:84)
... 83 more

До данного метода без проблем отрабатывают feign-клиенты по REST, поиск и сохранение в БД. Ошибка перехватывается только с помощью catch (Error e), как Exception не перехватить. Если кто-то встречал подобное, подскажите куда копать?

Ответы

▲ 1Принят

Проблема была в библиотеках. Было:

implementation group: 'org.glassfish.main.javaee-api', name: 'javax.jws', version: '3.1.2.2'
implementation group: 'javax.xml.ws', name: 'jaxws-api', version: '2.3.1'
implementation group: 'com.sun.xml.ws', name: 'jaxws-rt', version: '2.3.1'

Нужно сделать:

implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0'
implementation 'jakarta.xml.ws:jakarta.xml.ws-api:4.0.0'
implementation 'jakarta.activation:jakarta.activation-api:2.1.2'
implementation 'com.sun.xml.ws:jaxws-rt:4.0.1'
implementation 'com.sun.xml.bind:jaxb-impl:2.3.1'
implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.2'
runtimeOnly 'jakarta.xml.soap:jakarta.xml.soap-api:3.0.0'
runtimeOnly 'com.sun.xml.messaging.saaj:saaj-impl:3.0.2'

И соответственно, исправить импорты в классах с javax на jakarta