java - 在多个 WAR 中访问库的通用接口(interface)——这在 jboss 中可能吗?

标签 java jakarta-ee classloader jboss5.x

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

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

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

最佳答案

有多种方法可以完成您所说的事情,因此我将提出两种解决方案,我可以为您提供更多信息,以了解最适合您需求的那一种。

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

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

根据要求提供一些额外的细节(注意,以下是特定于 JBoss 的):

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

在您在 jboss-service.xml 中指定的任何路径中实现 MBean mbean元素的 code属性(示例中的 org.jboss.chap2.xmbean.JNDIMap)。为 jboss-service.xml 指定一致的 namespace 和参数mbean元素的 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()});
}

关于java - 在多个 WAR 中访问库的通用接口(interface)——这在 jboss 中可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6427612/

相关文章:

java - 将数据作为键值存储在数组 Java 中

java - 浏览器特定的 session 管理

java - 我可以使用其他引用类库中的 Java servlet Filter 类吗?

scala - 在 scala 2.10 中使用 typetag 获取类加载器

java - 如何使用 Java 加载插件类?

java - 通过 SSH 和使用 Spring Boot 连接到 MySQL

Java 堆行为

java - 如何绕过取消时的 Struts 验证

java - 如何使用 CriteriaQuery 查询具有枚举作为值的 JPA ElementCollection 映射中的键?

java - 由于类加载器问题导致的 ClassCastException