Как я могу использовать net.sf.saxon.s9api.XsltTransformer в нескольких потоках, чтобы не влиять на производительность иJAVA

Программисты JAVA общаются здесь
Anonymous
Как я могу использовать net.sf.saxon.s9api.XsltTransformer в нескольких потоках, чтобы не влиять на производительность и

Сообщение Anonymous »

В моем проекте я пытаюсь использовать net.sf.saxon.s9api.XsltTransformer в нескольких потоках с использованием синхронизации в Java, поскольку согласно документации XsltTransformer не должен использоваться одновременно в нескольких потоках. Однако безопасно повторно использовать объект в одном потоке для запуска одной и той же таблицы стилей несколько раз. Запуск таблицы стилей не меняет установленный контекст. Некоторые общедоступные методы синхронизированы: это происходит не потому, что поддерживается многопоточное выполнение, а для уменьшения ущерба при попытке многопоточного выполнения. но при попытке провести стресс-тест с использованием JMeter, отправив 100 запросов в секунду, я обнаружил, что net.sf.saxon.s9api.XsltTransformer.transform() занимает больше времени и иногда достигает 6 минут.
Как могу ли я использовать net.sf.saxon.s9api.XsltTransformer.transform() в нескольких потоках без ущерба для производительности?
Я пытался создать класс TransformerSingleton, как показано ниже

Код: Выделить всё

public class TransformerSingleton {

private static XsltTransformer transformer;

private TransformerSingleton() {

}

public static void xsltLoad() {

if (transformer == null) {
synchronized (XsltTransformer.class){
try {
Processor processor = new Processor(false);
XsltCompiler compiler = processor.newXsltCompiler();
XsltExecutable xslt = compiler.compile(new StreamSource("/my_path/"));
transformer = xslt.load();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

public static XsltTransformer getTransformer(){
if (transformer == null) {
synchronized (XsltTransformer.class) {
xsltLoad();
}

} return transformer;

}

}

Код: Выделить всё

public static void main(String[] args) {
XsltTransformer transformer = XsltTransformerSingleton.getTransformer();
String xml = "AAA"; // for example
try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(xml.getBytes())) {
synchronized (transformer){
Transformer.setSource(new StreamSource(byteArrayInputStream));
XdmDestination chainResult = new XdmDestination();
Transformer.setDestination(chainResult);
Transformer.transform();
}
}
}
ожидалось, что пропускная способность достигнет 100 запросов в секунду.
фактически я достигла 60 запросов в секунду.

Подробнее здесь: https://stackoverflow.com/questions/782 ... o-avoid-im

Вернуться в «JAVA»