我们目前有一个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:object不是声明类的实例.一点阅读表明我们需要为JNDI资源实现存根实现,但这似乎有很多麻烦(也许Spring可以帮助我们?)
我们还没有看过太多关于EJB的事情,但是在前两次尝试之后,我想知道我们想要实现的目标是否完全可能.
总结一下我们要实现的目标:一个JBoss实例,几个Web应用程序在DAO层和Hibernate之上使用一堆业务对象.
最好的祝福,
尼尔斯
Web应用程序是否部署在同一台服务器上?
我不能代表Spring,但使用Session Beans将业务逻辑转移到EJB层是很简单的.
申请组织很直接.Logic进入Session Beans,这些Session Beans作为带有ejb-jar.xml文件的Java EE工件捆绑在一个jar中(在EJB3中,这可能实际上是空的).
然后将实体类捆绑到一个单独的jar文件中.
接下来,您将构建每个Web应用程序到他们自己的WAR文件中.
最后,所有的jar和war都被捆绑到Java EE EAR中,并附带了相关的application.xml文件(同样,这可能非常简单,只需枚举EAR中的jar).
此EAR批量部署到应用服务器.
每个WAR实际上是独立的 - 它们自己的会话,有自己的上下文路径等.但是它们共享公共EJB后端,所以你只有一个二级缓存.
您还使用本地引用并调用语义与EJB进行通信,因为它们位于同一服务器中.这里不需要远程呼叫.
我认为这很好地解决了您所遇到的问题,并且在使用EJB 3的Java EE 5中它非常简单.
另外,正如我所理解的那样,你仍然可以在你的大部分工作中使用Spring,但我不是Spring人,所以我不能谈论细节.