Поймать "исключение отката" в цепочке EJB - PullRequest
0 голосов
/ 30 марта 2020
@Stateless
public class ProcessService {

    @Inject
    private HelloService helloService;

    @Inject
    private FooService fooService;

    public void process() {
        helloService.select(); // OK -> SELECT
        helloService.insert("Hello 1"); // OK -> INSERT
        try {
            fooService.unsafe(); // Some unknown exception (eg. RuntimeException) -> INSERT
        } catch (Exception e) {
            System.out.println("Catch exception and continue");
        }
        fooService.select(); // ERROR -> `STATUS_MARKED_ROLLBACK`
        fooService.insert("Hello 2"); // ERROR -> `STATUS_MARKED_ROLLBACK`
    }
}

Если helloService.insert() или fooService.insert() сгенерировать исключительную транзакцию, это должен быть откат, поэтому я не могу пометить ее как REQUIRES_NEW. Также я не могу пометить helloService.unsafe() как REQUIRES_NEW, потому что другие службы используют этот метод и нуждаются в REQUIRED.

Как решить эту проблему?

Моя идея заключается в том, чтобы извлечь некоторые логики c из HelloService и FooService в классы, помеченные как ApplicationScoped, и внедрить их в HelloService, FooService и ProcesService

...