Я работаю над проектом, в котором мы используем библиотеку, которая не гарантирует потокобезопасность (и не является) и однопоточную в сценарии потоков Java 8, которая работает так, как ожидалось.Хотите запустить библиотеку non-threadsafe параллельно - можно ли это сделать с помощью нескольких загрузчиков классов?
Мы хотели бы использовать параллельные потоки, чтобы получить плотные плотные масштабируемые плоды.
К сожалению, это приводит к сбою библиотеки - скорее всего, потому что один экземпляр вмешивается в переменные, совместно используемые с другим экземпляром, поэтому нам нужна изоляция.
Я рассматривал возможность использования отдельного загрузчика классов для каждого экземпляра (возможно, локального потока), который, насколько мне известно, должен означать, что для всех практических целей я получаю необходимую изоляцию, но я не знаком с намеренно созданием загрузчиков классов для этой цели.
Это правильный подход? Как мне это сделать, чтобы иметь надлежащее качество продукции?
Редактировать: меня попросили получить дополнительную информацию о ситуации, вызвав вопрос, чтобы лучше понять его. Вопрос по-прежнему касается общей ситуации, а не исправления библиотеки.
У меня есть полный контроль над объектом, созданным с помощью библиотеки (которая https://github.com/veraPDF/), как затянуты в
<dependency>
<groupId>org.verapdf</groupId>
<artifactId>validation-model</artifactId>
<version>1.1.6</version>
</dependency>
с помощью репозитория Maven проекта для артефактов.
<repositories>
<repository>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>vera-dev</id>
<name>Vera development</name>
<url>http://artifactory.openpreservation.org/artifactory/vera-dev</url>
</repository>
</repositories>
На данный момент невозможно затвердеть библиотеку.
EDIT: меня попросили показать код. Наш основной адаптер примерно:
public class VeraPDFValidator implements Function<InputStream, byte[]> {
private String flavorId;
private Boolean prettyXml;
public VeraPDFValidator(String flavorId, Boolean prettyXml) {
this.flavorId = flavorId;
this.prettyXml = prettyXml;
VeraGreenfieldFoundryProvider.initialise();
}
@Override
public byte[] apply(InputStream inputStream) {
try {
return apply0(inputStream);
} catch (RuntimeException e) {
throw e;
} catch (ModelParsingException | ValidationException | JAXBException | EncryptedPdfException e) {
throw new RuntimeException("invoking VeraPDF validation", e);
}
}
private byte[] apply0(InputStream inputStream) throws ModelParsingException, ValidationException, JAXBException, EncryptedPdfException {
PDFAFlavour flavour = PDFAFlavour.byFlavourId(flavorId);
PDFAValidator validator = Foundries.defaultInstance().createValidator(flavour, false);
PDFAParser loader = Foundries.defaultInstance().createParser(inputStream, flavour);
ValidationResult result = validator.validate(loader);
// do in-memory generation of XML byte array - as we need to pass it to Fedora we need it to fit in memory anyway.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XmlSerialiser.toXml(result, baos, prettyXml, false);
final byte[] byteArray = baos.toByteArray();
return byteArray;
}
}
, которая является функцией, которая отображает из InputStream (обеспечивая PDF-файл) в массив байтов (представляющий вывод отчета XML).
(Видя код, я заметил, что есть призыв к инициализаторе в конструкторе, который может быть виновником здесь, в моем конкретном случае. Я до сих пор, как решение общей проблемы.
Я не могу себе представить, как использование разных загрузчиков классов будет решать проблемы синхронизации. – rkosegi
Обычно мы говорим о классах threadafe и/или методах. Библиотека потокобезопасности * довольно широка. Какая библиотека? Я бы определенно попытался найти альтернативы, прежде чем начинать рассматривать хакеры класса loadload. – Kayaman
Этот фрукт не звучит так низко висит, если вам нужно спроектировать специальные загрузчики классов для каждого потока, когда создание резьбы не в ваших руках. – RealSkeptic