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: может деактивировать только активную транзакцию

Любые предложения приветствуются. Не стесняйтесь спрашивать другую информацию, которая может помочь вам в решении проблемы.

0 ответов

Другие вопросы по тегам