想要并行运行非线程安全库 - 可以使用多个类装入器完成吗?
我从事一个项目,其中我们使用的库不能保证线程安全(并且不是),并且在Java 8流场景中是单线程的,它按预期工作。
我们希望使用并行流来获得低悬的可扩展性成果。
不幸的是,这会导致库失败 - 很可能是因为一个实例干扰了与另一个实例共享的变量 - 因此我们需要隔离。
我正在考虑为每个实例(可能是线程本地)使用单独的类加载器,据我所知,这应该意味着出于所有实际目的,我得到了所需的隔离,但我不熟悉为此目的故意构造类加载器。
这是正确的方法吗?为了获得适当的生产质量,我应该怎么做?
编辑:我被要求提供有关触发问题的情况的其他信息,以便更好地理解它。问题仍然是关于一般情况,而不是修复库。
我可以完全控制由库创建的对象(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>
目前,强化库是不可行的。
编辑:我被要求显示代码。我们的核心适配器大致是:
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 报表输出)的函数。
(看到代码,我注意到构造函数中有一个对初始值设定项的调用,在我的特定情况下,这可能是罪魁祸首。我仍然想要一个通用问题的解决方案。