Использование транзакции с работоспособным - PullRequest
0 голосов
/ 05 октября 2018

У меня есть класс @Singleton ejb с этим методом.Транзакция фиксируется в конце тела метода, но у меня есть некоторые другие вещи в потоке myRunnable, которые я хочу, чтобы они были включены в текущую транзакцию.Есть ли способ сделать это?

@PostConstruct
public void init() {
    try {
        // do some other stuff
        managedExecutorService.execute(myRunnable);
    } catch (Exception e) {
        LOG.error("Error when initializing...", e);
    }
}

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Нет, нет способа разделить контекст транзакции между двумя потоками.

Невозможно перенести контекст транзакции в асинхронный вызов EJB по той же причине.

Вы скорее должны думать о транзакции как о чем-то, что всегда связано с потоками.

0 голосов
/ 08 октября 2018

Ваш "поток myRunnable" не может быть включен в текущую транзакцию.

Вы не должны использовать службу исполнителя Java (EJB Spec 16.2.2) или напрямую управлять потоками:

Корпоративный компонент не должен пытаться управлять потоками.... Эти функции зарезервированы для контейнера EJB.Разрешение корпоративному бину управлять потоками уменьшит способность контейнера правильно управлять средой выполнения.

Вам необходимо использовать службу управляемого исполнителя , представленную в Java EE 7.

Что касается транзакций, документация гласит:

Задачи выполняются в управляемых потоках, предоставляемых провайдером продуктов Java ™ EE, и выполняются в контексте компонента приложения, который отправил задачу.Все задачи выполняются без явной транзакции (они не включаются в транзакцию компонента приложения).Если требуется транзакция, используйте экземпляр UserTransaction.Экземпляр UserTransaction доступен в JNDI с использованием имени: «java: comp / UserTransaction» или при запросе внедрения объекта UserTransaction с использованием аннотации Resource.

0 голосов
/ 05 октября 2018

Вы можете создать 1 метод, который вызывает 2 других метода с TransactionAttributeType.MANDATORY

public void yourMethod(){
    yourMethod1();
    yourMethod2();
}

@TransactionAttribute(TransactionAttributeType.MANDATORY)
private void yourMethod1(){
}

@TransactionAttribute(TransactionAttributeType.MANDATORY)
private void yourMethod2(){
}

TransactionAttributeType.MANDATORY будет использовать транзакцию из вызывающей стороны

...