2010-08-10 127 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