簡體   English   中英

Java EE | ejb3 | 運行時調度

[英]java ee | ejb3 | runtime dispatch

我想在運行時調用ejb3。 ejb的名稱和方法的名稱僅在運行時可用,因此在編譯時不能包含任何遠程接口。

String bean = 'some/Bean';
String meth = 'doStuff';

//lookup the bean
Object remoteInterface = (Object) new InitialContext().lookup(bean);

//search the method ..
// foreach (methods)
// if method == meth, method.invoke(bean);

這些bean應該分布在多個應用程序服務器上,並且所有bean都將被遠程調用。

有什么提示嗎? 特別是我不想

  1. 依賴注入
  2. 在調度程序中包含特定於應用程序的ejb接口(如上所述)
  3. webservices,那就像浪費處理能力,所有的xml廢話

是否可以通過網絡加載ejb3遠程接口(如果是,如何?),所以我可以將接口緩存在某種哈希圖中。

我有一個使用遠程調度程序bean的解決方案,該解決方案可以包含在上面的主調度程序中,它的功能基本相同,但是只是將調用中繼到本地ejb(我可以查找該方法嗎?命名查找失敗)。 給定遠程調度程序bean,我可以使用依賴項注入。

謝謝你的幫助

(順便說一句,網豆和玻璃魚)

ejb3調用使用RMI。 RMI支持遠程類加載,因此建議您對此進行研究。

同樣,JMX mbeans支持完全無類型的遠程調用。 因此,如果您可以使用mbeans代替會話bean,那可能會起作用。 (例如,JBoss支持帶有一些自定義注釋的類似ejb3的mbean)。

最后,許多應用程序服務器支持CORBA調用,而CORBA支持無類型的方法調用。

您可能可以使用java.rmi.server.RMIClassLoader進行遠程類加載。 您還需要加載遠程服務返回或拋出的所有類。

無法完成。 您將始終收到“找不到類”異常。 我認為這是EJB / Java的最大缺點。 由於元語言功能有限,因此您失去了一些活力。

EJB3支持RMI / IIOP,但不支持RMI / JRMP(標准RMI),因此不支持動態類加載。您松開了一些Java通用性,但獲得了諸如能夠就事務和安全性進行通信之類的其他功能。

為此,您需要使用反射,這非常簡單。 假設您正在尋找一個稱為meth的void方法:

Object ejb = ctx.lookup(bean);
for (Method m : ejb.getClass().getMethods()) {
    if (m.getName().equals(meth) && m.getParameterTypes().length == 0) {
        m.invoke(service);
    }
}

如果您正在尋找特定的方法簽名,只需相應地修改m.getParameterTypes()測試,例如,對於具有單個String參數的方法,您可以嘗試:

Arrays.equals(m.getParameterTypes(), new Class[]{String.class})

然后將帶有實際參數的Object []數組傳遞給m.invoke()調用:

m.invoke(service, new Object[]{"arg0"})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM