我想在运行时调用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。
任何提示?特别是我不想要:
是否可以通过网络加载ejb3远程接口(如果是,怎么做?),所以我可以将接口缓存在某个hashmap中。
我有一个远程调度程序bean的解决方案,我可以将其包含在上面的主调度程序中,它基本上是相同的,但只是将调用中继到本地ejb(我可以查找如何?命名查找失败)。给定远程调度程序bean,我可以使用依赖注入。
感谢您的帮助
(netbeans和glassfish btw)
答案 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"})