0

Пожалуйста, посмотрите на этот фрагмент:EJB Bean связан с другим незавершенной сделки

@Stateless 
public class A { 
    @EJB 
    B b; // B is stateful EJB 

    b.init(); // initialize Sets and List that are used in doSthInB(C c) 
    public void doSthInA(){ 
     for(C c){ 
      b.doSthInB(c); // doSthInB use REQUIRES_NEW transaction type 
     } 
    } 
} 

Мое намерение заключается в обрабатывать коллекцию объектов типа С. Метод doSthInB изменяет сущности и результат должен быть сохранен в конец вызова метода (вот почему я пользователь REQUIRES_NEW). Когда во время обработки какого-либо элемента из входной коллекции возникает некоторая ошибка, тогда только эта операция не должна сохраняться, она должна регистрироваться и обработка других элементов не должна останавливаться.

Что я получаю во время обработки является: javax.ejb.EJBException: java.lang.IllegalStateException: Bean is associated with a different unfinished transaction

Может быть, моя идея не так. Какие-нибудь советы?

+0

ОК, ребята, я изменил Stateful на безгражданство. Теперь я получаю интересное исключение NPE. Кажется, что для некоторых сборников итераций, которые я инициализирую в b.init(), не создается. Я перебираю сотни объектов в цикле for, и я полагаю, что контейнер ejb использует более одного ejb для обработки каждого вызова b.doSthInB (c). Но только для первого ejb вызывается b.init(), и именно поэтому я получаю NPE. Я прав? –

ответ

2

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

Я не знаю, полностью ли вы знаете, что это такое . Если не пытайтесь избежать использования этого подхода. Я думаю, что это, вероятно, станет причиной вашего исключения.

+0

Интересно, я не знал о каком-либо недостатке дизайна. Даже в факторе без состояния, когда код работает, он блокируется одним потоком, который отбирал его из пула, поэтому я не видел, почему возникает проблема с введением объекта с включенным в поток данных, связанного с потоком, в EJB без состояния. Если есть проблемы с границами транзакций, как это подразумевает этот поток. Знаете ли вы о каких-либо хороших материалах для чтения по этому вопросу? – Gimby

+2

Я впервые понял эту проблему при чтении [EJB 3.1 в действии] (http://refcardz.dzone.com/refcardz/dependency-injection-in-ejb3); об исключении может помочь спецификация [ejb 3.1] (https://jcp.org/aboutJava/communityprocess/final/jsr318/). Также [здесь] (http://stackoverflow.com/questions/9384368/access-existing-instance-stateful-inside-stateless-java-ee-6?answertab=votes#tab-top) есть хороший ответ. –

+0

Тогда я прочитаю эту книгу, прочитав все книги, которые я прочитал на EJB tech, этот конкретный лакомый кусочек еще не прошел обзор. – Gimby

Смежные вопросы