如何使用Web服务接口作为插件动态加载EJB?

时间:2012-07-04 10:07:24

标签: java-ee soap jboss ejb

我有一个Web应用程序,它的数据有一个可选的SOAP接口(实现为一堆EJB)。主应用程序和SOAP接口是分开的,只共享数据库访问代码,但最近它们被集成为一个应用程序(SOAP接口打包为添加到主应用程序依赖性的JAR)。两者都托管在JBoss服务器上。

该解决方案可行,但我们的应用程序使用模块化插件界面,允许使用Maven定位插件,从应用程序的用户界面打开和关闭特定功能。然后使用URLClassLoader加载插件,并将应用程序的默认类加载器作为父加载,并注册到映射到*.page的通用页面调度程序servlet:

<!-- from web.xml -->
<servlet-mapping>
  <servlet-name>dispatcer</servlet-name>
  <url-pattern>*.page</url-pattern>
</servlet-mapping>

在当前的解决方案中,使用web.xml公开EJB:

<!-- the very same web.xml -->
<servlet>
  <display-name>BaseService</display-name>
  <servlet-name>BaseService</servlet-name>
  <servlet-class>ourapp.services.BaseService</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>BaseService</servlet-name>
  <url-pattern>/services/Base/*</url-pattern>
</servlet-mapping>

当然,当EJB:s在运行时加载时,我们无法提前指定它们,所以:

如何从JAR加载EJB:s并在运行时将它们作为Web服务公开?

2 个答案:

答案 0 :(得分:1)

没有用于动态加载EJB的标准API(我甚至不知道任何允许这样做的供应商API)。通常,EE部署专注于前期打包,使应用程序服务器能够内省您的应用程序并执行各种准备和优化。

答案 1 :(得分:1)

您可以将Web应用程序拆分为EJB jar和WAR以及部署/重新部署。 然后在您的应用中,您可以检查特定服务的可用性。

如果您使用JBoss AS 7,那么您可以利用Management API来部署/取消部署插件EJB jar。
见这里: