1

我想在运行时调用 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,我可以使用依赖注入。

谢谢你的帮助

(网豆和玻璃鱼顺便说一句)

4

4 回答 4

1

ejb3 调用使用 RMI。RMI 支持远程类加载,所以我建议研究一下。

此外,JMX mbeans 支持完全无类型的远程调用。因此,如果您可以使用 mbeans 而不是会话 bean,那可以工作。(例如,JBoss 支持带有一些自定义注释的类似 ejb3 的 mbean)。

最后,许多应用服务器支持 CORBA 调用,而 CORBA 支持无类型方法调用。

于 2008-11-09T05:58:25.710 回答
0

您也许可以使用 java.rmi.server.RMIClassLoader 进行远程类加载。您还需要加载远程服务返回或抛出的任何类。

于 2008-11-11T16:11:20.977 回答
0

为此,您需要使用反射,这很简单。假设您正在寻找一个名为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"})
于 2009-01-20T14:55:07.767 回答
0

这是不可能的。您将始终收到“找不到类”异常。在我看来,这是 EJB/Java 的最大缺点。你失去了一些动态,因为元语言功能是有限的。

EJB3 支持 RMI/IIOP,但不支持 RMI/JRMP(标准 RMI),因此不支持动态类加载。您失去了一些 Java 通用性,但获得了其他特性,例如能够就事务和安全性进行通信。

于 2009-01-16T12:04:12.737 回答