Может ли транзакция распространяться между EJB-компонентами из разных приложений в Weblogic? - PullRequest
9 голосов
/ 15 февраля 2012

Мы разрабатываем систему, которая имеет две основные логики; Это логика управления, которая очень легка; а другая - это логика обработки, которая потребляет очень много ресурсов (ОЗУ + ЦП).

Мы решили иметь один компьютер для запуска логики управления и один (или несколько) других компьютеров для запуска логики обработки.
Чтобы разделить логику на разные машины, мы создали приложение (EAR) для каждой логики, которое дает нам два отдельных приложения.

Теперь мы используем Weblogic в качестве сервера приложений и еще не настроили наш домен для запуска приложений на разных компьютерах.

Прежде чем мы это сделаем, мы хотим знать; Когда EJB из приложения управления вызовет EJB из приложения обработки, будет ли транзакция распространяться? Если управляющий EJB откатит свою транзакцию, будет ли обработчик также откатывать ее? Требует ли эта функция специальной настройки домена?

1 Ответ

7 голосов
/ 22 февраля 2012

Да. Если вы следуете передовым методам и не пытаетесь делать глупости, транзакции и откаты будут распространяться. Это именно то, для чего предназначены EJB! Если вам нужна помощь в том, как правильно вводить EJB-файлы с помощью @EJB, отличным руководством будет освоение EJB3.1 или краткая рефкартная запись EJB3.0 из JavaLobby.

EJB-компоненты используют декларативное управление транзакциями, поэтому вам необходимо убедиться, что вы поместили правильную декларацию в свой Бин:

@Stateless
@Remote({MyService.class})
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class MyServiceBean implements MyService {
    ...awesome code here
}

EDIT

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

Если вы находитесь в сервлете и вызываете 6 EJB, помеченных REQUIRED, вы получите 6 транзакций, потому что граница транзакции начинается при каждом вызове EJB и заканчивается существующим методом.

Если вы находитесь в EJB и вызываете 6 дополнительных EJB, помеченных REQUIRED, вы получите одну транзакцию, потому что граница транзакции уже начата.

...