EJB3 RMI клиент - PullRequest
       25

EJB3 RMI клиент

1 голос
/ 10 августа 2010

В настоящее время я работаю с толстым клиентским приложением, использующим самописный RMI-сервер (10 лет назад).Сервер отправляет компоненты EJB1.1 / 2.0 клиенту, который имеет полный доступ к этим удаленным объектам.После принятия транзакции все грязные компоненты сохраняются сервером.

План состоит в том, чтобы заменить сервер JBoss5 & EJB3 без (массового) изменения клиентского приложения (примерно 10000 файлов классов).Типичный фрагмент кода клиента:

UserTransaction tx = ClientCtxManager.getUserTransaction();
tx.begin();
DummyClassHome dummyHome = (DummyClassHome)lookup(DummyClassHome.class.getName());
DummyClass dummy = dummyHome.findByPrimaryKey(1234);
dummy.setValue("Hello World");
tx.commmit();

-> на сервере сохраняется пустышка.

В JBoss я использую сессионный компонент без сохранения состояния для выполнения findByPrimaryKey.В этом искателе я ищу RemoteInterface сессионного компонента с состоянием, который я хотел бы использовать для переноса объекта на клиент.Из-за сериализации / десериализации объект теряет соединение с сеансом, что было бы жизненно важно для принятия изменений.

// DummyHome implementation
public MyClass findByPrimaryKey(BigDecimal pk)
{
Session s = HibernateUtil.getSessionFactory().getCurrentSession();
MyClassEntity temp = (MyClassEntity)s.get(MyClassEntity.class, (BigDecimal)pk);
// session.contains(temp) delivers true  
MyClassRemote remote = (MyClassRemote)InitialContextFactory.getInitialContext().lookup("DemoEAR/MyClassBean/remote");
remote.setENTITY(temp); // set the member variable of the stateful session bean
//session.contains(remote.getENTITY()) delivers false
return remote;
}

Любые предложения приветствуются!

1 Ответ

0 голосов
/ 10 августа 2010

Ваша основная проблема - системные границы между клиентом и сервером.

Если бы клиент и сервер были локальными (например, веб-интерфейс с EJB3-сервером), вы могли бы изменить код с помощью вашего подхода без особых усилий.

Но в вашем случае клиент и сервер являются удаленными, и сущность EJB3 действительно отсоединится при возврате с сервера, чего не было в EJB2, где Entity Bean были удаленными объектами.

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

Возможный способ иметь дело с отсоединенными сущностями:

  1. Использовать расширенный контекст постоянства с SFSB, таким образом, сущность остается присоединенной кна стороне клиента.Я не видел ни одного приложения, использующего это по-настоящему, но это может быть чем-то, что нужно изучить.
  2. Отправьте сущность EJB3 обратно после того, как вы изменили ее, и объедините изменения на стороне сервера.
  3. Взгляните на H3T .Никогда не использовал его, но он решает некоторые проблемы, связанные с границами системы и транзакций.

Надеюсь, вы найдете подходящий вам шаблон.

...