java ee | ejb3 |运行时调度

时间:2008-11-09 03:00:22

标签: java java-ee ejb javabeans

我想在运行时调用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废话
  4. 是否可以通过网络加载ejb3远程接口(如果是,怎么做?),所以我可以将接口缓存在某个hashmap中。

    我有一个远程调度程序bean的解决方案,我可以将其包含在上面的主调度程序中,它基本上是相同的,但只是将调用中继到本地ejb(我可以查找如何?命名查找失败)。给定远程调度程序bean,我可以使用依赖注入。

    感谢您的帮助

    (netbeans和glassfish btw)

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

无法做到。您将始终获得“未找到课程”的例外情况。在我看来,这是EJB / Java的最大缺点。你失去了一些动力,因为元语言的特征是有限的。

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

答案 3 :(得分: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"})