2010-06-30 2 views
6

фонВесна Распределенная транзакция Вовлечение вызовов RMI?

У меня есть приложение Spring Client, что положения сервиса для двух серверов с использованием RMI. В клиенте я сохраняю объект в базе данных (легко) и делаю rmi-вызовы на два сервера с подробной информацией об объекте. Я использую Spring 3.0.2 на серверах, а клиент - простой сайт Spring-mvc.

Требование

Мое требование, что если какие-либо из RMI вызовов не сервера, вся транзакция откатывается, то есть объект не сохраняется на клиенте, и если либо RMI вызов был успешным, что это тоже откат.

Я относительно новичок в распределенных транзакциях, но я предполагаю, что мне нужна транзакция XA, использующая вызовы RMI.

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

спасибо.

ответ

3

Вот как эта ситуация может быть теоретически рассмотрена. Сначала вам нужно иметь несколько распределенных диспетчеров транзакций JTA на каждом узле. Один действует как хозяин, другой - как рабы. Мастер согласовывает фиксацию/откат распределенной транзакции с подчиненными. Существуют автономные JTA-реализации, например. JOTM.

Vanilla RMI не поддерживает распространение информации о контексте, такую ​​как идентификатор транзакции операции. Но я думаю, что у RMI есть крючки, чтобы его можно было расширить, чтобы поддержать это. Вы можете посмотреть Carol.

Вам необходимо будет использовать XAResource, чтобы обернуть участников транзакции, чтобы их можно было зачислить в распределенную транзакцию. Мастер должен будет отправить сообщения фиксации/отката на ведомые устройства, которые должны будут использовать XATerminator, чтобы действовать соответствующим образом.

Спецификация JTA - это только распределенная транзакция manager, ведение журнала операций в журнале транзакций должно выполняться серверами. Библиотека существует для управления журналом транзакций, например. HOWL.

Я не думаю, что Spring можно использовать - даже с распределенным менеджером транзакций - сделать это легко. Однажды я попытался использовать RMI с распределенной транзакцией, управляемой автономным клиентом и несколькими подчиненными. Вот об этом blog post. Это было довольно сложно.

Вы можете получить все это бесплатно, если используете сервер приложений Java EE, с IIOP. IIOP поддерживает распространение распределенных транзакций. Клиент может быть application client container, и вы можете контролировать транзакции с помощью UserTransaction. На самом деле это один из редких случаев, когда я думаю, что использование сервера приложений действительно оправдано.

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

Моим последним советом было бы: попытаться найти конструкцию, которая не включает в себя распределенную транзакцию, если это возможно. Это сделает вас намного проще.

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

+0

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

1

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

Вы можете попытаться написать свою собственную реализацию XAResource (не уверен, что это лучший способ, но все же) и зарегистрировать ее в контейнере приложения, но Spring не поможет вам с этим.

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