当前,我们有一个Web应用程序加载一个Spring应用程序上下文,该上下文实例化一堆业务对象,DAO对象和Hibernate。我们希望与另一个Web应用程序共享此堆栈,以避免具有相同对象的多个实例。
我们研究了几种方法;使用JMX或JNDI或EJB3公开对象。
不同的方法都有其问题,我们正在寻找一种轻量级的方法。
关于如何解决这个问题有什么建议吗?
编辑:我收到了评论,请我详细说明,所以去了:
我们要解决的主要问题是我们只想拥有一个Hibernate实例。这是由于运行多个使用相同数据源的客户端应用程序时,Hibernate的二级缓存无效而导致的。而且,业务/ DAO /hibernate堆栈正在变得相当大,因此不进行重复只是更有意义。
首先,我们尝试研究如何将业务层单独暴露给其他Web应用程序,而Spring以少量XML的价格提供了JMX包装。但是,我们无法将JMX实体绑定到JNDI树,因此无法从Web应用程序中查找对象。
然后,我们尝试将业务层直接绑定到JNDI。尽管Spring没有为此提供任何方法,但是使用JNDITemplate绑定它们也是微不足道的。但这带来了几个新问题:1)安全管理器拒绝访问RMI类加载器,因此一旦我们尝试在JNDI资源上调用方法,客户端就会失败。2)解决安全问题后,JBoss抛出了IllegalArgumentException:对象不是声明类的实例。一些阅读显示我们需要JNDI资源的存根实现,但这似乎很麻烦(也许Spring可以帮助我们?)
我们还没有对EJB进行太多研究,但是在前两次尝试之后,我想知道我们试图实现的目标是否完全可能。
总结一下我们要实现的目标:一个JBoss实例,几个Web应用程序在DAO层和Hibernate之上利用了一组业务对象。
最好的祝福,
尼尔斯
Web应用程序是否部署在同一服务器上?
我不能代表Spring,但是使用Session Bean将业务逻辑转移到EJB层很简单。
应用程序组织很简单。逻辑进入会话Bean,这些会话Bean作为Java EE工件与ejb- jar.xml文件一起捆绑在一个jar中(在EJB3中,这实际上是空的)。
然后将您的实体类捆绑到一个单独的jar文件中。
接下来,您将把每个Web应用程序构建到它们自己的WAR文件中。
最后,所有的jar和wars都与相关的application.xml文件捆绑到了Java EE EAR中(同样,将枚举在EAR中的jars,这可能很小)。
该EAR批量部署到了应用服务器。
每个WAR实际上都是独立的-自己的会话,上下文路径等。但是它们共享公共的EJB后端,因此您只有一个二级缓存。
您还使用本地引用和调用语义与EJB进行对话,因为它们位于同一服务器中。此处无需远程呼叫。
我认为这可以很好地解决您遇到的问题,并且在带有EJB 3的Java EE 5中非常简单。
另外,据我了解,您仍然可以在大部分工作中使用Spring,但由于我不是Spring人士,所以我无法透露细节。