Я добавляю подпружиненное приложение в существующий продукт и запускаю исключение ClassCastException, которое я не могу решить. Я считаю, что это связано с несколькими загрузчиками классов, но я не до конца понимаю, как решить эту проблему.
Приложение представляет собой сервер сокетов DICOM, и теперь я добавляю некоторые RestAPI для использования Spring-Boot.
Как часть индексации входящих данных DICOM, мне нужно проанализировать данные и при этом динамически загрузить класс анализатора значений.
У меня есть фабрика плагинов, построенная с использованием версии 2.2.1
из: org.xeustechnologies.jcl.JarClassLoader
, который делает это. Он также кэширует классы, поскольку они используются снова и снова для каждой транзакции DICOM.
Фрагмент класса PluginFactory:
public Object load(String theClass, InputStream additionalJar) {
Object plugin = null;
try {
JarClassLoader jcl = new JarClassLoader();
if (additionalJar != null) {
jcl.add(additionalJar);
}
plugin = alreadyLoaded.get(theClass);
if (plugin == null) {
JclObjectFactory factory = JclObjectFactory.getInstance();
plugin = factory.create(jcl, theClass);
alreadyLoaded.put(theClass, plugin);
log.debug("Successfully loaded: "+theClass);
}
} catch (Exception e) {
log.debug("Failed to load: "+theClass);
log.error(e,e);
plugin = null;
}
return plugin;
}
Этот метод загрузки из PluginFactory вызывается множество раз для каждая транзакция из класса индексации.
IValueParser parser = (IValueParser) pFactory.load(descriptor.getcClassName());
byte[] rowKey = parser.parse(node.getSourceObject(), sdo);
Это эффективно и безупречно работает в многопоточной среде сервера сокетов DICOM.
Проблема возникает при обработке загруженного файла DICOM через После этого я получаю следующую ошибку:
[DEBUG] 2020-04-20 19:28:35,428 [http-nio-8080-exec-1] com.example.core.factory.PluginFactory load - Successfully loaded: com.example.core.model.schema.parser.StudyIndexRowKey
[ERROR] 2020-04-20 19:28:35,428 [http-nio-8080-exec-1] com.example.core.db.HBase writeIndexEntry - java.lang.ClassCastException: com.example.core.model.schema.parser.StudyIndexRowKey cannot be cast to com.example.core.model.schema.parser.IValueParser
java.lang.ClassCastException: com.example.core.model.schema.parser.StudyIndexRowKey cannot be cast to com.example.core.model.schema.parser.IValueParser
at com.example.core.model.schema.HBaseSchema.getRowKey(HBaseSchema.java:277)
at com.example.core.db.HBase.writeIndexEntry(HBase.java:136)
at com.example.core.db.HBaseIndexWriter.run(HBaseIndexWriter.java:58)
at com.example.core.webservice.server.DicomRestApiController.uploadFile(DicomRestApiController.java:173)
Конечно StudyIndexRowKey реализует IValueParser, и он прекрасно работает, если он не работает под той же JVM, что и spring-boot.
Буду очень признателен за любые советы, как решить эту проблему!