Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как зарегистрировать ресурс, в транзакции, на сервере приложений  
:(
    Опции темы
KostenkoSergey
Дата 13.10.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



Доброго времени суток!

Можно ли создать некий ресурс, для которого при откате транзакции контейнером будет вызываться метод rollback() ?
Насколько я начал разбираться, нужно то ли имплементить XAResource то ли ещё что то ...  и зарегистрироваить как то этот объект в менеджере транзакций..  smile 

Может у кого то есть пример илим ссылка с чего начинать копать ?

Опишу в нескольких словах проблему, а то мож я вообще не в ту сторону копаю smile

1. Есть SLSB, который выполняет некую логику, потом вызывает по http, внешний сервис.
2. Внешний сервис, грубо говоря делает какую-то jdbc-операцию.
3. После этого SLSB, делает ещё одну jdbc-операцию.

Эти три шага, если кратко и надо по-уму оформить в одну транзакцию, а то бывают ситуации, когда и пункт 2 отработал, и пункт 3 вроде как прошёл.. но потом, например, контейнер решит откатить транзакцию (мало ли что ему прийдёт в голову smile )... и в результате JDBC-операции не пройдут, а где пробовать слать сигнал для отката внешнего сервиса - не понятно...


Не знаю, получилось ли у меня донести мысль - но с нетерпением жду совета  smile 
PM ICQ   Вверх
mbasil
Дата 13.10.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



Как я понял SLSB - это Stateless Session Bean. Если это действительно так, я бы попробовал в этом компоненте реализовать интерфейс SessionSynchronization,  у которого есть collback методы :

afterBegin() - после начала транзакции
beforeCompletion() - перед завершением транзакции (здесь ее еще можно откатить)
afterCompletion() - после завершения транзакции, где можно выяснить отменена она или зафиксирована

Уверен, что этот листенер работает с CMT, но не уверен, что работает с BMT, а докуменации под рукой нет.
Во всяком случае проверить стоит.

Добавлено через 12 минут и 1 секунду
Соврал !!!  Извините, это только для Stateful Session Bean.

С другой стороны а не поможет ли делу простой вызов в конце Вашего метода

getRollbackOnly() на объекте EJBContext с целью проверки - не вознамерился ли контейнер откатить транзакцию.
PM MAIL   Вверх
KostenkoSergey
Дата 13.10.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



Цитата(mbasil @  13.10.2008,  15:21 Найти цитируемый пост)
С другой стороны а не поможет ли делу простой вызов в конце Вашего метода
getRollbackOnly() на объекте EJBContext с целью проверки - не вознамерился ли контейнер откатить транзакцию. 


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

Это сообщение отредактировал(а) KostenkoSergey - 13.10.2008, 15:47
PM ICQ   Вверх
mbasil
Дата 13.10.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



Можно еще попробовать задействовать перехватчик бизнес методов:

1. Возражение о продолжении транзакции можно снять, если
   в бизнес методе, выполняющем транзакцию заставить контейнер
   обязательно создавать новую транзакцию, которую он будет
   обязан зафиксировать или откатить после выхода из этого метода. 

2. А нельзя ли задействовать перехватчик, который будет срабатывать 
   после выполнения бизнес метода. Хотя здесь остается вопрос -
   о какой транзакции после завершения метода мы запрашиваем.
Код

  @Stateless
  public class AccountManagementBean implements AccountManagement {

    @Resource EJBContext ctx;

    public void createAccount(int accountNumber,
    AccountDetails details) { ... }
    public void deleteAccount(int accountNumber) { ... }
    public void activateAccount(int accountNumber) { ... }
    public void deactivateAccount(int accountNumber) { ... }
    //-----------------------------------------------------------
    @AroundInvoke public Object getSumth( InvocationContext inv )
                    throws Exception {
        Method m = inv.getMethod();
        long time = System.currentTimeMillis();
        try {
              return inv.proceed(); 
          }
        finally {
             if( m.getName.equals("...") ) { 
                      
               // а вот здесь выяснить не отменена ли транзакция
           }
        }
    }
}
  

Это сообщение отредактировал(а) mbasil - 13.10.2008, 17:25
PM MAIL   Вверх
necromancer
Дата 14.10.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



>Можно ли создать некий ресурс, для которого при откате транзакции контейнером будет вызываться метод rollback() ?
по идее будет бросатся исключение, а после исключения хоть обвызывайтесь.
Другое дело если хочется сделать единый механизм для ручного отката и автоматического, тогда можно поковырять сорцы =)


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0716 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.