java ee | ejb3 |运行时调度
我想在运行时调用ejb3。ejb的名称和方法名称仅在运行时可用,因此我不能在编译时包含任何远程接口java ee | ejb3 |运行时调度,java,jakarta-ee,ejb,javabeans,Java,Jakarta 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 ==
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都将被远程调用
有什么提示吗?具体而言,我不想要:
(netbeans和glassfish顺便说一句)ejb3调用使用RMI。RMI支持远程类加载,因此我建议对此进行研究 而且,JMX MBean支持完全非类型化的远程调用。因此,如果您可以使用MBean而不是会话bean,那就可以了。(例如,JBoss支持类似ejb3的MBean,并带有一些自定义注释)
最后,许多应用服务器支持CORBA调用,CORBA支持非类型化方法调用。ejb3调用使用RMI。RMI支持远程类加载,因此我建议对此进行研究 而且,JMX MBean支持完全非类型化的远程调用。因此,如果您可以使用MBean而不是会话bean,那就可以了。(例如,JBoss支持类似ejb3的MBean,并带有一些自定义注释)
最后,许多应用服务器支持CORBA调用,CORBA支持非类型化方法调用。您可以使用java.rmi.server.RMIClassLoader进行远程类加载。您还需要加载远程服务返回或抛出的任何类。您可以使用java.rmi.server.RMIClassLoader进行远程类加载。您还需要加载远程服务返回或抛出的任何类。这无法完成。您将始终得到一个“未找到类”异常。在我看来,这是EJB/Java最大的缺点。由于元语言功能有限,您失去了一些dynamcis
EJB3支持RMI/IIOP,但不支持RMI/JRMP(标准RMI),因此不支持动态类加载。您失去了一些Java通用性,但获得了其他功能,如能够就事务和安全性进行通信。这是无法做到的。您将始终得到一个“未找到类”异常。在我看来,这是EJB/Java最大的缺点。由于元语言功能有限,您失去了一些dynamcis
EJB3支持RMI/IIOP,但不支持RMI/JRMP(标准RMI),因此不支持动态类加载。您失去了一些Java通用性,但获得了其他功能,如能够就事务和安全性进行通信。您需要为此使用反射,而且操作非常简单。假设您正在寻找一个名为meth的void方法: 如果要查找特定的方法签名,只需相应地修改m.getParameterTypes()测试,例如,对于具有单个字符串参数的方法,可以尝试:
Arrays.equals(m.getParameterTypes(), new Class[]{String.class})
然后将带有实际参数的Object[]数组传递给m.invoke()调用:
您需要使用反射来实现这一点,这非常简单。假设您正在寻找一个名为meth的void方法: 如果要查找特定的方法签名,只需相应地修改m.getParameterTypes()测试,例如,对于具有单个字符串参数的方法,可以尝试:
Arrays.equals(m.getParameterTypes(), new Class[]{String.class})
然后将带有实际参数的Object[]数组传递给m.invoke()调用:
m.invoke(service, new Object[]{"arg0"})