2010-08-10 130 views
1

我目前正在使用自写的RMI服务器(10年前)的胖客户端应用程序上工作。服务器将EJB1.1/2.0 bean发送给可以完全访问这些远程对象的客户端。提交事务后,所有脏bean都被服务器持久化。EJB3 RMI客户端

该计划是在没有(大规模)更改客户端应用程序(大约10000个类文件)的情况下,通过JBoss5 & EJB3替换服务器。 一个典型的客户剪断将是

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上,我使用无状态会话bean来执行findByPrimaryKey。在这个查找器中,我查找了一个有状态会话bean的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; 
} 

任何建议,将不胜感激!

回答

0

您的主要问题是客户端和服务器之间的系统边界。

如果客户端和服务器是本地的(例如,带有EJB3后端的Web UI),那么您可以使用您的方法轻松更改代码。

但在你的情况下,客户端和服务器是远程的,并且当从服务器返回EJB3实体时,EJB3实体将确实变成分离的,而EJB2中的实体Bean是远程对象。

分布式事务是在客户端使用EJB3开始的分布式事务,但是我建议不要这样做。不过,我明白,改变可能太多了。

可能的方式来处理分离的实体:

  1. 使用与SFSB,这样的实体仍然在客户端连接的扩展持久化上下文。我还没有看到任何使用该应用的应用,但可能需要进行探索。
  2. 在修改EJB3实体并合并服务器端的更改后,请发回EJB3实体。
  3. 看看H3T。从未使用过它,但它解决了与系统和事务边界有关的一些问题。

希望你会找到适合你的模式。

+0

Thx为您的答案,它显示了我正确的方向。我现在在我的SFSB中注入EntityManager时使用了扩展持久化上下文(@PersistenceUnit(unitName =“xyz”,type = PersistenceContextName.EXTENDED) – websta 2010-08-17 13:55:20