【问题标题】:How to force WebSphere Liberty to start WARs in certain order如何强制 WebSphere Liberty 以特定顺序启动 WAR
【发布时间】:2019-09-13 23:54:18
【问题描述】:

您知道如何强制 WebSphere Liberty 按给定顺序启动 WAR(单独部署或在单个 EAR 文件中部署)。默认情况下,WLP 是并行启动它,并且没有关于如何调整它的信息。

我知道,在完整的 WebSphere Application Server 中,有 / 有这样的选项来定义 deployment.xml 中的起始权重,但在 WLP 中它似乎缺失了。

【问题讨论】:

  • 开箱即用,不,没有办法强制应用启动排序。但是,有一些方法可以通过部署脚本来完成。你能再描述一下用例吗?我怀疑有更好的替代设计,它不需要应用按特定顺序出现。
  • 我有两个应用程序在同一个数据库上工作。一个应用程序在启动时加载一些数据,第二个应用程序假设这些数据已经在 DB 上可用 - 这是我正在准备部署的客户的一种功能需求。
  • 我已经在考虑准备这样的启动脚本,它将给定的 WAR 复制到 WLP 的“应用程序”文件夹中,等待启动,然后开始复制第二个应用程序并重复该过程。但它表现不佳(每次启动 serer 时都必须提取 WAR)。我也在考虑 MBeans——也许有一些用于启动应用程序的 API,在 server.xml 中将“autoStart”设置为“false”。但不幸的是,这个解决方案都不是清晰简单的。
  • 也许您应该修改第二个应用程序以不假定数据已准备好并处理它需要等待它的可能性?看来即使可以让 app2 等待 app1 启动,app1 中的慢查询或数据库访问问题仍然会导致 app2 失败

标签: jakarta-ee war websphere-liberty ear


【解决方案1】:

目前,Liberty 中没有开箱即用的方法来控制应用程序的启动顺序。

一些替代选项可能是:

1) 每台服务器使用 1 个应用程序

拆分服务器,这样每个服务器只有一个应用程序,然后使用容器编排层在服务器级别强制排序。

2) 使用 dropins + shell 脚本

使用${server.config.dir}/dropins/ 文件夹并使用脚本以受控顺序将应用程序移动到该文件夹​​中。例如:

mv firstApp.war /path/to/server/dropins/
# wait some amount of time as a heuristic
sleep 5
mv nextApp.war /path/to/server/dropins/

3) 使用 autoStart=false 并以 ApplicationMBean 启动

如果您在应用程序上设置了<application autoStart="false">,您可以通过JMX 调用ApplicationMBean.start() 来控制开始排序。请参阅 ApplicationMBean docWorking with JMX MBeans on Liberty


这个请求已经提出了几次,所以我们打开了this github issue 来讨论一个内置的解决方案。

【讨论】:

  • 您知道是否可以使用 WLP 提供的 MBean 来实现某些目标,例如com.ibm.websphere.webcontainer.WebModuleMBean ?
  • 是的,您也可以使用 JMX,尽管您希望使用 ApplicationMBean 而不是 WebModuleMBean。我已更新我的答案以包含第三个选项
  • 这与我已经计划做的事情差不多(见我之前的评论)。但是感谢您确认不可能以不同的方式进行操作。顺便说一句,您为 OpenLiberty 创建了问题。这是否意味着它也将被考虑用于 IBM Websphere Liberty?
  • 是的,因为 OpenLiberty 是 IBM WebSphere Liberty 的一个子集。这是一个进一步澄清的问答:stackoverflow.com/questions/46306036/…
【解决方案2】:

现在可以在 Liberty 20.0.0.4 版本中实现这一点(尽管它至少在 20.0.0.6 之前处于测试阶段)。

要在“app2”之前启动“app1”,您需要在“app2”上指定“startAfter”属性。

<application id="app1" location="start_me_first.war"/>
<application id="app2" location="start_me_later.war" startAfter="app1"/>

startAfter 属性采用应用程序 ID 列表,因此您可以指定多个应用程序,必须先启动该应用程序才能启动该应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    相关资源
    最近更新 更多