2012-05-23 3 views
1

Я использую транзакцию XA (2 фазы). Я хочу войти в одну таблицу журналов через класс журнала и Entity Manager. Мой метод внутри EJB Session Bean выглядит следующим образом:ejb3 изолированный (автономный) транзакция внутри сеанса bean

private void logError(Throwable throwable) { 
    LogEntity logEntity = new LogEntity(); 
    // Set everything 
    entityManager.persist(logEntity); 
} 

Я хочу это в изолированной (автономной) сделки независимо от какой-либо «внешней» сделки. Я уже пытался добавить @TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) и @TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED) перед именем метода и не работает.

Перед тем, как вызвать метод EJB3 создать транзакцию пользователя, как:

try { 
    UserTransaction transaction = (UserTransaction)context.lookup("javax.transaction.UserTransaction"); 
    transaction.begin(); 
    // Call EJB3 method 
    transaction.commit(); 
} catch (Throwable t) { 
    t.printStackTrace(); 
    try { 
     transaction.rollback(); 
    } catch (SystemException e) { 
     e.printStackTrace(); 
    } 
} 

Я хочу Вход не имеет значения, если совершить это делается или нет. Как?

С уважением

ответ

0

атрибуты транзакции являются релевантно только при вызове через прокси-сервер. Они не применяются к прямым вызовам, которые включают частные методы. Попробуйте что-то вроде следующего (который использует EJB 3.1 не-интерфейс зрения, хотя вы могли бы создать отдельный локальный интерфейс для ведения журнала, если у вас есть только EJB 3.0):

@Stateless 
@Local(BusinessInterface.class) 
@LocalBean 
public class MyBean { 
    @EJB MyBean logger; 

    @TransactionAttribute(REQUIRED) 
    public void businessMethod() { 
    try { 
     ... 
    } catch (Throwable t) { 
     logger.logError(t); 
     ... 
    } 
    } 

    @TransactionAttribute(NOT_SUPPORTED) 
    public void logError(Throwable t) { 
    ... 
    } 
} 

Важный кусок, что вызов LogError происходит через внедренный EJB-прокси, который позволяет контейнеру иметь контроль, чтобы приостановить транзакцию XA на время использования метода logError.

+0

Да. Но в методе logError я хочу «зафиксировать» данные независимо от того, совершает ли пользователь (из транзакции XA) или откатывает все. Я пробовал это, но не работает ... Внутри logError я сохраняю() и после этого flush(). Но без везения. 10x – zmeda

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