Распределенная транзакция Spring Вовлечение вызовов RMI возможно? - PullRequest
6 голосов
/ 30 июня 2010

Фон

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

Требования

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

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

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 30 июня 2010

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

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

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

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

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

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

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

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

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

1 голос
/ 30 июня 2010

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

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

...