Spring Boot Restart не удается из-за UnsatisfiedLinkError: Dll уже загружена в другой загрузчик классов - PullRequest
0 голосов
/ 21 июня 2019

У меня есть приложение Spring Boot, которое загружает некоторые библиотеки DLL при запуске.Теперь у меня есть требование перезапустить приложение программно, когда возникают определенные условия.

Я использую встроенную точку перезапуска привода Spring Boot для перезапуска приложения.Приложение работает нормально, до тех пор, пока оно не начнет загружать библиотеки DLL снова, и в этот момент происходит сбой с приведенной ниже ошибкой.

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dealerConnection' defined in file [C:\Users\xxx\IdeaProjects\atlas\mw-service\out\production\classes\com\mlp\atlas\mwservice\mw\connect\DealerConnection.class]: Bean instantiation via constructor failed; nested exception is java.lang.UnsatisfiedLinkError: Native Library C:\Users\xxx\IdeaProjects\atlas\mw-service\lib-bin\sw_boost_thread_lib.dll already loaded in another classloader
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:304)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:285)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1154)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1244)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1164)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760)
    ... 19 common frames omitted
Caused by: java.lang.UnsatisfiedLinkError: Native Library C:\Users\xxx\IdeaProjects\atlas\mw-service\lib-bin\sw_boost_thread_lib.dll already loaded in another classloader

Вот простой код, необходимый для перезапуска приложения.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.restart.RestartEndpoint;
import org.springframework.stereotype.Service;

@Service
public class RestartService {

    @Autowired
    private RestartEndpoint restartEndpoint;

    public void restartApp() {
        restartEndpoint.restart();
    }
}

Этот код загружает библиотеки DLL в память -

    static {
        if (SystemUtils.IS_OS_WINDOWS) {
            log.info("Application running on a Windows Platform. Loading MarkitWire dlls first");

            loadLibrary("sw_boost_thread_lib");
            loadLibrary("sw_libeay32");
            loadLibrary("sw_ssleay32");
            loadLibrary("sw-xerces-c_3_1");
            loadLibrary("sw-XalanMessages_1_11");
            loadLibrary("sw-Xalan-C_1_11");
            loadLibrary("sw_api");
            loadLibrary("SWAPILink");

            log.info("Completed loading of dlls");
        } else {
            log.info("Application running on a Non-Windows Platform. Loading .so file");
            loadLibrary("SWAPILink");
        }

У меня нет идей относительно того, как можно сначала выгрузить DLL, а затем перезапустить приложение весенней загрузки (но я считаю, что это не таквозможно выгрузить dll - ОС делает это автоматически), ИЛИ поставить проверку ранее загруженной DLL при повторной загрузке.

Или есть какой-то другой способ с перезагрузкой Spring Boot Actuator, чтобы полностью убитьприложение, а затем перезапустите его?

Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...