EMF модель транзакции
В нашем проекте мы используем реализацию документа HL7 от openehealth. Эта реализация использует EMF в качестве примитивной модели и делегирует все вызовы EMF. Нам нужно обрабатывать большой объем документов, и наши потоки включают параллельную обработку документов (чтение, проверка, запрос). В среде параллелизма слой EMF падает с UnsupportedOperationException. На сайте openehealth говорится, что нужно обрабатывать синхронизированную обработку в клиентском API, но это снизит производительность нашей системы, и мы этого не хотим. Я попробовал API транзакции EMF, TransactionalEditingDomain, который говорит, что поддерживает транзакции модели только для чтения, но без успеха. Мой тест выглядит примерно так:
ExecutorService executorService = Executors.newFixedThreadPool(4);
final List<ClinicalDocument> documents = new ArrayList<ClinicalDocument>();
for (int i = 0; i < 100; i ++) {
executorService.submit(new Runnable() {
@Override
public void run() {
try {
int randomNum = 1 + (int)(Math.random()*6);
ClinicalDocument cda = readCda();
processIntensiveWork(cda);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
private void processIntensiveWork(final ClinicalDocument document) {
for (final Method method : document.getClass().getMethods())
if (method.getName().startsWith("get")) {
try {
domain.runExclusive(new RunnableWithResult.Impl() {
@Override
public void run() {
try {
method.invoke(document);
System.out.println("Invoked method: " + method.getName());
setResult(null);
} catch (UnsupportedOperationException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Для этого теста мы часто ловили исключение java.lang.UnsupportedOperationException. Я упоминаю, что для некоторых тестовых случаев я также обнаружил следующую ошибку из API транзакции EMF: java.lang.IllegalArgumentException: может деактивировать только активную транзакцию
Любые предложения приветствуются. Не стесняйтесь спрашивать другую информацию, которая может помочь вам в решении проблемы.