【问题标题】:Restart Windows service when not respond无响应时重启 Windows 服务
【发布时间】:2018-02-19 18:07:11
【问题描述】:

由于数据库问题,我工作的旧服务正在冻结。而且我正在寻找比修复它更简单的解决方案。

在应用程序表单版本 (Delphi) 中,Windows 识别并显示应用程序没有响应的消息。

Windows 能否识别服务未响应并重新启动服务?

在服务属性中,恢复仅针对失败。

【问题讨论】:

  • 修复您的服务。听起来你有一些线程问题。但无论如何,对于您的情况,人们通常会创建一种与服务交互的 guardian,如果它停止响应,他们会重新启动服务进程。
  • 没有看到您的代码,我只能根据您的信息假设您正在主服务线程中执行所有操作。您应该从不在主线程中实现服务。 总是创建一个单独的线程来为您的服务完成所有实际工作。
  • 这是一个遗留代码,在所有客户端中只有一个有这个问题。如果有的话,我正在寻找更便宜的解决方案。
  • 一天几次,同一查询多次使用不会立即返回,需要几分钟然后返回,就好像什么都没发生一样。问题来自 Oracle RAC 的数据库驱动程序。我不能这样做,现在也没有时间更改线程。

标签: windows delphi service


【解决方案1】:

在应用程序表单版本 (Delphi) 中,Windows 识别并显示应用程序没有响应的消息。

仅当主 UI 线程被阻塞时,您不应该在主 UI 线程中执行任何可能阻塞它的操作。糟糕的代码设计。

Windows 能否识别服务未响应并重新启动服务?

不是自动的,不。您需要修复您的数据库代码,使其不再冻结。如果这不是一个选项(我非常怀疑),那么您将不得不编写一个单独的看门狗线程/进程来监视您的代码/服务并在它冻结时将其杀死。如果您终止整个服务,则可以使用 Windows 故障操作来重新启动它。

【讨论】:

  • 是的,这不是最好的设计,而是具有直接本地数据库访问权限的遗留代码,通常没有问题。只有一个客户端在第三方 Oracle RAC 驱动程序中存在问题。我正在寻找一种简单的方法,如果有自动重启它对我有用。
猜你喜欢
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多