У меня есть приложение 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, чтобы полностью убитьприложение, а затем перезапустите его?
Спасибо за помощь.