【问题标题】:Will Java code be terminated in the middle if server is down suddenly如果服务器突然宕机,Java代码会在中间终止吗
【发布时间】:2019-10-21 12:26:18
【问题描述】:

假设我有一个 1000 行代码的 java 函数,它部署在 weblogic 上。

如果 PC 或 Weblogic 突然关闭(即强制关闭),代码是否有可能在 1000 行的第 X 行运行和终止?

如果是,有没有办法在服务器恢复时“运行”其余代码(从 X+1 到 1000)。

谢谢。

【问题讨论】:

  • 这听起来更像是服务器稳定性问题而不是编程问题。如果服务器需要关闭,您始终可以先以安全的方式关闭应用程序。

标签: java jvm weblogic


【解决方案1】:

如果 PC 或 Weblogic 突然关闭(即强制关闭),代码是否有可能在 1000 行的第 X 行运行和终止?

是的。

如果是,有没有办法在服务器恢复时“运行”其余代码(从 X+1 到 1000)。

您必须实现这样的机制,然后它需要“重置”到X 之前的某个点,然后恢复事务。虽然,您的实现可能是带有持久消息的 Rabbit MQ 主题。更典型的配置(根据我的经验)涉及在一个集群中运行多个 Weblogic 服务器,并在这种情况下故障转移到该集群的另一个成员(并结合持久队列)。

【讨论】:

  • 谢谢,该函数实际上是在集群中运行的,我们发现在故障转移/服务器停机期间代码有时会运行一半。使用MQ,能否保证整个代码可以完整运行(不熟悉)?
  • 你的问题还是比较模糊;服务器随时可能崩溃。您需要将代码设计为快速失败和以处理一般的失败。您可能还会发现在代码中添加额外的跟踪有助于找到故障的根源。
【解决方案2】:

无论您的代码在做什么,它都可能随时被外部故障中断。 JRE 本身是无状态的;没有自动的方法可以在某个点恢复。代码本身必须设计为“可重新启动”。也就是说,它必须将状态保存到一些外部的、持久的服务中。如果此代码正在修改外部资源(调用 Web 服务、数据库等),它还必须以某种方式在重新启动时将其保存的状态与外部资源同步。

RabbitMQ 可以在某些方面提供帮助——它是一种有保证的传递消息总线。它可以确保传递到外部资源的消息。如果您想要一个分布式的、集群感知的应用程序,它还可以在您的代码的多个运行实例之间同步,这很难做到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2020-07-10
    • 2018-05-15
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多