Java 在多场战争中访问库的通用接口-在jboss中是否可能?

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

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

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


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

有几种方法可以满足您的需求,因此我将提出两种解决方案,我可以为您提供最适合您需求的更多信息

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

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

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

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

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

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

//获取连接
MBeanServerConnection=org.jboss.mx.util.MBeanServerLocator.locateJBoss();
//查询chap2.xmbean命名空间中的MBean
Set mbeans=connection.queryMBeans(null,新对象名(“chap2.xmbean:service=*”);
//在每个MBean上循环并调用接口方法
for(反对mbean:mbeans)
{
//调用示例中的“put”方法。如果这是一个info方法,则将返回MBean操作的结果
调用(mbean.getObjectName(),“put”,新对象[]{“TestKey”,“TestValue”},新字符串[]{Object.class.getName(),Object.class.getName()});
}

嗨,斯蒂芬,你的第二个解决方案听起来很有趣。我不能使用portlet,我也不想使用。我很想了解你的第二个选择——听起来可能是最合适的。我被告知在jboss论坛中检查jboss的定制部署器,但这看起来有点像项目本身。好吧,你的选择听起来更好,请分享你的想法和任何相关的材料也会很好。干杯,我已经添加了开始时需要的额外细节。如果你遇到麻烦或有更具体的问题,请告诉我。祝你好运(PS JBoss在网上的文档记录似乎很差,但我知道如果你想要一个全面的资源,还有一些好书)好的,所以我一定是夸大了,我找不到一个全面的JBoss 5参考,但我认为JBoss at Work()很好地涵盖了你需要的内容,即使它在技术上适用于JBoss 4。
//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()});
}