【问题标题】:Let a ear deployment programmatically mark itself as failed让 ear 部署以编程方式将自己标记为失败
【发布时间】:2016-03-05 06:22:32
【问题描述】:

我一直在寻找一种以编程方式让部署自行停止的方法。

对于我们的用例,我们部署了多个耳朵,其中一个是最重要的,其他的则依赖于它。我们确保重要的耳朵首先部署,然后其他耳朵开始并行部署。

我们面临的问题是重要的耳朵可以处于升级模式,这是有效的。

在之后启动的ear中,我们检查运行模式,当它不正常时,我们抛出一个RuntimeException。对每个 ear 部署的检查都发生在 Singleton Startup EJB3 Bean 中。但是当这些抛出 RuntimeException 时,部署仍然处于活动状态。我想通知容器部署应标记为失败。这样的事情可能吗?

我们使用的技术有:Wildfly 10、Java-ee 7、EJB3。

我在 stackoverflow 上找到了一个解决方案,它使用命令行 CLI 来停止部署。 Can a deployment stop itself? 在我看来应该可以在源代码本身中做到这一点。

有什么想法吗?

【问题讨论】:

  • 不知道部署选项,但如果简单地提供一个 REST 服务,当部署工作时返回“OK”,否则会失败,这不是更容易吗?
  • 我用我描述的单例解决方案做到了这一点。 ear2 单例启动 bean 调用 ear1(重要)项目并在运行模式不正确时抛出 RuntimeException,但这不会将部署标记为失败。由于该项目没有取消部署,因此允许其他 bean(例如已调度)做一些事情。我想找到一个在启动期间检查运行模式的解决方案,如果不正确就会失败。
  • 队长明显:使用runtime.exec()调用shell命令? (不太明显,有一些用户文件系统权限问题)
  • 如何使用标记文件和 java.io.File api?

标签: java jakarta-ee wildfly java-ee-7 ejb-3.2


【解决方案1】:

在我看来,部署不能自行停止是合乎逻辑的。如果可以,应用程序应该在哪里报告它已成功取消部署?到一个不再存在的应用程序?在我看来,使用 CLI 的选项是您所拥有的最佳解决方法。

附带说明:您为什么要使用多个 EAR?一个 EAR 可以包含多个 WAR 和 EJB,因此无需拥有多个 EAR。此外,几乎所有项目都可以使用简单的 WAR,我已经多年没有使用 EAR。

【讨论】:

  • 那些耳朵是“重要”耳朵的“客户”,是几个战争和ejb模块的组合。我同意应用程序自行取消部署很奇怪。但我也认为一个应用程序应该能够在启动过程中退出,即如果它的先决条件不满足。
  • 它可以在启动过程中退出。但是,您正在执行一个 Singleton bean,所以它不是在启动期间而是在启动之后。
  • 我明白 ejb3 单例启动 bean 与“在启动期间运行”不同。然而,这是我希望实现这种检查的第一个地方,因为它是在容器部署应用程序时运行的。如果 ejb 系统不是实现“前置条件检查逻辑”的地方,那会是什么?
  • 应用程序容器管理器。这是 CLI,在 Wildfly 中没有 API。也许 JSR 373 会改变这一点,但 JSR 计划用于 Java EE 8,预计在 2017 年推出。blogs.oracle.com/theaquarium/entry/java_ee_management_api_2
  • 啊,我不知道那个 JSR,但它确实给了我另一个角度来看待这个具体问题。感谢您的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
相关资源
最近更新 更多