有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在多场战争中访问库的java公共接口在jboss中有可能吗?

作为一个背景-我正在使用JBoss5.1,用于web应用程序。这些应用程序是垂直部署的,因此每个功能最终都位于一个单独的WAR文件中。它有一个用于dao和业务逻辑的jar文件。这到目前为止还不错,但是我需要部署另一个本身没有太多逻辑的应用程序——它基本上是一个类似于say dashboard的视图。仪表板需要聚合来自不同数据提供商的数据(通常是其他应用程序/功能)。现在,仪表板对其他功能了解得太多了。因此,每次添加新功能时,该仪表板都会重新部署,并添加相关代码

如果此仪表板有一个其他功能很少实现的通用接口,并且每当部署新功能(WAR)时,仪表板也可以从新的提供者动态获取数据,那就太好了。这可能吗?如果不是的话,在不操纵应用程序的类加载器的情况下,我最接近什么?如果首先知道这在jboss中是否可行,那就太好了

如果你需要更多信息,请告诉我


共 (1) 个答案

  1. # 1 楼答案

    有两种方法可以实现您所说的,因此我将提出两种解决方案,我可以为您提供有关最适合您需要的解决方案的更多信息

    一个相对快速的解决方案是使用像GateIn这样的门户服务器。你的战争可以显示在同一页上,但它们将在不同的地方,而不是集成。您必须将WAR转换为portlet,并让管理员将它们添加到门户的UI中,但门户将能够扫描和检测所有可用的portlet

    更灵活的解决方案是让每个部署的一个类实现一个公共MBean接口。然后,您的仪表板可以使用JMX,特别是javax.management.MBeanServerConnectionqueryMBeans方法来获取所有MBean(或者属于特定包的MBean子集,您可以将其指定为查询参数)。然后可以通过javax.management.MBeanServerConnectioninvoke方法执行接口方法。要获得与JBoss的MBeanServerConnection,请调用org.jboss.mx.util.MBeanServerLocator.locateJBoss()

    根据要求提供一些附加细节(注意,以下是JBoss特有的):

    1)将您的部署转变为MBean的部署 对于每个JAR文件,将jboss-service.xml*-xmbean.xml文件添加到META-INF目录中(其中*是您选择的名称)。按照this example查找这些文件

    jboss-service.xml{}元素的code属性(org.jboss.chap2.xmbean.JNDIMap)中指定的任何路径上实现MBean。为jboss-service.xml{}元素的name属性指定一致的命名空间和参数(chap2.xmbean:service=在本例中)。在*-xmbean.xml文件中指定的操作和属性应该精确地映射到您的接口

    2)创建仪表板,并在其中一个类中轮询服务(此代码尚未测试,但应提供良好的大纲)

    //Get the connection
    MBeanServerConnection connection = org.jboss.mx.util.MBeanServerLocator.locateJBoss();
    
    //Query for MBeans in the chap2.xmbean namespace
    Set<ObjectInstance> mbeans = connection.queryMBeans(null, new ObjectName("chap2.xmbean:service=*"));
    
    //Loop over each MBean and invoke an interface method
    for (ObjectInstance mbean : mbeans)
    {
        //Invoking 'put' method from example. If this were an info method, this would return the result of the MBean operation
        connection .invoke(mbean.getObjectName(), "put", new Object[] {"TestKey", "TestValue"}, new String[] {Object.class.getName(), Object.class.getName()});
    }