使用 JBoss 和 Spring 在 Java Web 应用程序之间共享业务对象实例的最佳方式是什么?

2022-09-03 14:32:40

我们目前有一个加载Spring应用程序上下文的Web应用程序,该上下文实例化了一堆业务对象,DAO对象和Hibernate。我们希望与另一个 Web 应用程序共享此堆栈,以避免具有相同对象的多个实例。

我们研究了几种办法;使用 JMX 或 JNDI 或使用 EJB3 公开对象。

不同的方法都有其问题,我们正在寻找一种轻量级的方法。

关于如何解决这个问题的任何建议?

编辑:我收到了要求我详细说明的评论,所以这里是:

我们要解决的主要问题是,我们只想有一个 Hibernate 实例。这是由于在运行多个使用同一数据源的客户端应用程序时,Hibernate 的第 2 级缓存失效的问题。此外,业务/ DAO / Hibernate堆栈正在变得相当大,因此不复制它只是更有意义。

首先,我们试图研究如何将业务层单独暴露给其他Web应用程序,Spring以少量XML的价格提供了JMX包装。但是,我们无法将 JMX 实体绑定到 JNDI 树,因此无法从 Web 应用程序中查找对象。

然后,我们尝试将业务层直接绑定到 JNDI。尽管Spring没有为此提供任何方法,但使用JNDITemplate绑定它们也是微不足道的。但这导致了几个新问题:1)安全管理器拒绝访问RMI类装入器,因此一旦我们尝试在JNDI资源上调用方法,客户端就失败了。2)一旦安全问题得到解决,JBoss就抛出了TravialArgumentException:object不是声明类的实例。稍微阅读一下就会发现,我们需要 JNDI 资源的存根实现,但这似乎很麻烦(也许 Spring 可以帮助我们?)

我们还没有对EJB进行过多的研究,但是在前两次尝试之后,我想知道我们试图实现的目标是否可能。

总结一下我们试图实现的目标:一个JBoss实例,几个Web应用程序利用DAO层和Hibernate之上的一堆业务对象。

此致敬意

尼尔斯


答案 1

Web 应用程序是否部署在同一台服务器上?

我不能代表Spring,但是使用会话Bean将您的业务逻辑移动到EJB层是很简单的。

应用程序组织是直截了当的。逻辑进入会话Bean,这些会话Bean作为Java EE工件与ejb-jar.xml文件捆绑在一个jar中(在EJB3中,这几乎是空的)。

然后将实体类捆绑到单独的 jar 文件中。

接下来,您将把每个 Web 应用构建到它们自己的 WAR 文件中。

最后,所有的 jar 和 war 都捆绑到一个 Java EE EAR 中,其中包含相关的应用程序.xml文件(同样,这可能是非常小的,只需枚举 EAR 中的 jar)。

此 EAR 以批发方式部署到应用服务器。

每个 WAR 实际上都是独立的 - 它们自己的会话,有自己的上下文路径等。但它们共享公共 EJB 后端,因此您只有一个 2nd 级缓存。

您还可以使用本地引用和调用语义来与 EJB 通信,因为它们位于同一服务器中。这里不需要远程呼叫。

我认为这很好地解决了你所遇到的问题,在Java EE 5和EJB 3中,它非常简单。

另外,据我所知,你仍然可以使用Spring来完成你的大部分工作,但我不是Spring的人,所以我不能谈论细节。


答案 2

推荐