java ee | ejb3 |运行时调度

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 ==

我想在运行时调用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都将被远程调用

有什么提示吗?具体而言,我不想要:

  • 依赖注入
  • 在调度程序中包含特定于应用程序的ejb接口(如上)
  • Web服务,这就像白白浪费了处理能力,所有的xml垃圾
  • 是否可以通过网络加载ejb3远程接口(如果可以,如何加载?),以便我可以将接口缓存在一些hashmap或其他东西中

    我有一个带有远程调度程序bean的解决方案,我可以将其包含在上面的主调度程序中,它的功能基本相同,但只是将调用中继到本地ejb(我可以查找如何?命名查找失败)。给定远程调度程序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"})