热部署Java EAR以最小化或消除服务器上应用程序的停机时间?

热部署Java EAR以最小化或消除服务器上应用程序的停机时间?,java,deployment,jboss,Java,Deployment,Jboss,我听说JavaRebel就是这么做的,但是有没有其他好的方法来部署新版本的EAR,同时允许用户在以前的版本上保持活动状态?我们在应用服务器上使用JBoss…这不是JavaRebel所做的。JavaRebel(根据描述)热替换内存中的类。在现有系统连接的情况下,这是不可接受的,因为更新的类可能会破坏客户端的逻辑 有一次,我在一家公司工作,遇到了类似的问题,解决方法如下: 智能路由器被用作负载均衡器 新版本已部署到(新)群集的50%节点 新的连接严格地传递给这些更新的节点,旧的连接在旧节点之间进行

我听说JavaRebel就是这么做的,但是有没有其他好的方法来部署新版本的EAR,同时允许用户在以前的版本上保持活动状态?我们在应用服务器上使用JBoss…

这不是JavaRebel所做的。JavaRebel(根据描述)热替换内存中的类。在现有系统连接的情况下,这是不可接受的,因为更新的类可能会破坏客户端的逻辑

有一次,我在一家公司工作,遇到了类似的问题,解决方法如下:

  • 智能路由器被用作负载均衡器
  • 新版本已部署到(新)群集的50%节点
  • 新的连接严格地传递给这些更新的节点,旧的连接在旧节点之间进行平衡
  • 旧节点已脱机(一个接一个,以使每个节点的客户端数量保持在限制范围内)
  • 同时,新版本被部署到离线的“旧”节点上,并作为新节点提出来
  • 由于EJB集群,会话和bean被其他旧节点拾取
  • 最后(几个小时后),只剩下一个旧节点,只有一个旧版本的实例,所有使用旧版本的客户端都连接到它
  • 当最后一个旧客户端断开连接时,该节点已关闭
现在,我不是一个网络人,也不能给你很多细节(比如什么是路由器硬件等等)。我的理解是,这可以很容易地设置,除非,如果我没记错的话,我们必须设置一个额外的Weblogic域来部署应用程序的新版本(否则它将与JNDI名称上的旧版本冲突)

希望有帮助

p.S.Ichorus发表评论说,该应用程序部署在客户端服务器上。因此,路由器技巧可能不可行。现在,我只看到一个可行的解决方案(现在是21:52,我可能忽略了一些事情:)——

  • 开发具有“版本化”JNDI名称的新版本;e、 如果CustomerBean在版本1中位于ejb/Customer之下,那么在版本2中它将位于ejb/Customer2之下
  • 在应用程序中有一个具有稳定的基本接口(工厂风格)的业务外观,当要求客户bean时,它会尝试查找最高版本的JNDI名称(当然不是每次调用都可以缓存一个小时左右)。该外观可以(也应该)作为一个单独的应用程序进行部署——而且从未或很少更新
  • 现在,每个新客户机都可以访问部署的最新应用程序,并且应用程序不会发生冲突
这种方法需要仔细的计划和测试,但应该在IMHO中起作用


我最近以类似的方式修改了一些应用程序,让它们共存于同一个域中(在它们对不同的数据源使用相同的JNDI名称之前)

我认为您可能希望使用OSGI框架研究Spring。

据我所知,WebLogic有一种称为并行部署的功能,可以消除EAR版本升级过程中的停机时间。您可以在不停止现有应用程序的情况下部署新版本,并且一旦成功部署新版本,就可以透明地从旧版本切换到新版本

我不确定其他应用服务器是否支持此功能


参考:

Vladimir关于使用负载平衡器的建议是实现所需功能的一种非常可靠的方法。请记住,它不一定是高端硬件负载平衡器。相反,如果您使用本机web服务器(Apache或IIS)和mod_jk或mod_代理前置JBoss服务器,那么您可以维护一个公共web外观,并在EAR升级时实现适用的加载和路由例程


//尼古拉斯(Nicholas)

这是一个很有帮助的、非常直接和合理的解决方案。不幸的是,我们的许多客户端都没有负载平衡器,我们保存会话状态的方式有点过时,只保存在本地应用程序服务器的缓存中(我一直主张对此进行更改)。感谢您的输入。哦,那么您是在客户端服务器上部署应用程序?当然,这变化很大。除非在JNDI名称中实现某种版本控制,否则这是不可能的,我会说……我想知道更多关于智能路由器用作负载平衡器的信息,您是否检查用户会话并将其路由到旧版本?很高兴知道!但是我很难看到处理相同URL的两个版本的servlet如何共存。该功能可能仅适用于带有RMI客户端的纯EJB应用程序。。。