Совершить при открытии новой транзакции внутри транзакции - PullRequest
3 голосов
/ 14 июня 2011

Использование Ejb3.0, Weblogic 11g, JDBC

Я вызываю метод, который выполняется удаленно в другом EAR развертывания.

Метод в удаленном развертывании вызывается, но он помечается как@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

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

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

Любая идея?

Некоторый код для объяснения:

@CallByReference
@Stateless(mappedName = "ejb/OperatorProccessBean")
@Local({ OperatorProccessBeanLocal.class })
@Remote({ OperatorProccessBeanRemote.class })
public class OperatorProccessBean implements OperatorProccessBeanLocal,  
 OperatorProccessBeanRemote
{   

...

   SBNDispatchBeanRemote SBNDispatchBean = (SBNDispatchBeanRemote) context.lookup("ejb/SBNDispatchBean#com.mirs.sbn.dispatch.SBNDispatchBeanRemote");
    if (SBNDispatchBean == null)
    {
            logger.error(TAG + " SBNDispatchBean is null");

    }
    else
    {
         //until here I want all my data to be commited without waiting for the upcoming remote method to finish
         SBNDispatchBean.updateSubscriberInBlockingList(...);
    }
...
 }

Теперь метод updateSubscriberInBlockingList() помечен

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

Я хочу, чтобы данные были зафиксированы до вызова этого метода.

Заранее спасибо,лучей.

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

Теперь метод updateSubscriberInBlockingList () аннотируется @TransactionAttribute (TransactionAttributeType.REQUIRES_NEW)

Я хочу, чтобы данные были зафиксированы до вызова этого метода.

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

Это поведение не настраивается, поскольку для контейнера EJB и JTA Transaction Manager предполагается придерживаться поведения, указанного в спецификации JTA, которая получена из модели транзакций X / Open DTP. В модели X / Open DTP, если новая транзакция запущена, а другая выполняется, текущая приостанавливается и возобновляется в более поздний момент времени. Следует отметить, что никакая модель транзакции, , возможно, не будет (я не изучил все), позволяющей совершить текущую транзакцию и начать новую. Я видел только вложенные транзакции или приостановленные транзакции, поддерживаемые в различных моделях обработки транзакций.

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

1 голос
/ 14 июня 2011

Поместите логику "перед удаленным вызовом" в отдельный метод компонента, также аннотированный REQUIRES_NEW.Таким образом, у вас будет три транзакции:

  • одна для основного метода (но которая ничего не сделает, пока не будет выполнен удаленный вызов);
  • одна для логики перед удаленнымвызов;
  • один для удаленного вызова.
...