【问题标题】:How to know if a web service has started如何知道 Web 服务是否已启动
【发布时间】:2014-10-27 07:01:15
【问题描述】:

我有以下场景:

  • 在 jBoss 上托管了一个 Web 服务。
  • Java 应用程序使用 Web 服务。

现在通常的启动场景是:

  • jBoss 启动并加载 Web 应用程序。
  • 然后启动应用程序并使用 Web 服务。

现在的问题:

如果 Java 应用程序先启动,有什么方法可以让它知道 Web 服务已经启动?

我曾想过定期 ping Web 服务,但这可能会产生一些开销。欢迎任何解决方案。

【问题讨论】:

  • 是肥皂式还是休息式?
  • 尝试使用它。如果它不存在,您将获得相应的异常。
  • @EPJ 是的,我确实得到了适当的例外。但是我需要一种方法来确定 Web 服务是否稍后启动,以便应用程序可以自动正常启动。
  • 为什么?会有什么不同?当您需要调用它时,它要么可用,要么不可用。如果不是,您需要应对由此产生的故障。无论是因为启动顺序还是网络故障还是核爆炸,都没有任何区别。确定任何资源可用性的唯一明智方法是在程序执行的正常过程中尝试使用它。其他任何事情,你都在引入时间窗口,试图预测未来,......
  • 应用程序在启动期间需要 Web 服务。现在,如果我想要它而不是仅仅停止启动,我等待服务启动,那么我还有什么其他方法?如果我不必在出现故障时重新启动应用程序,那不是很好吗?

标签: java web-services web-applications jboss


【解决方案1】:

定期“Ping”Web 服务并不是很大的开销。为什么会这样?

在重试之间稍等片刻。一种常见的策略是将尝试之间的等待时间增加到最大值。例如。尝试,如果尚未准备好,请等待 1 秒,然后再试一次,如果仍未准备好,请等待 2 秒,然后等待 4 秒,以此类推,重试之间最多 8 秒。

同时向用户显示一条消息,例如:

"Waiting for web service to start..."

可选地包括到目前为止的尝试次数,例如:

"Waiting for web service to start... (retrying #2)"

另外,您也可以将一个小的静态文本文件作为 web 应用程序的一部分提供,例如“ping.txt”,并尝试将其作为您的测试应用程序是否准备好并且可用,您不必调用网络服务本身。它还可以指向Servlet,在这种情况下,您可以确保 servlet 容器也已启动(当然禁用此 ping url 的缓存)。

另外,如果您的 web 服务模块有大量的时间来启动,“ping”的目标可能是 web 服务的 wsdl 文档。大多数 Web 服务框架都提供了一种访问/下载 Web 服务动态生成的 WSDL 文档的方法。如果该 URL 响应并发回动态 WSDL 文档,则 wsdl 模块也已启动。

【讨论】:

  • 谢谢。我也有同感,pinging 是一个简单的解决方案,应该可以正常工作。但我仍然想知道是否有其他方法可以解决它。您知道来自 Web 服务的响应或其他一些想法。看来我现在会坚持 ping。
  • 即使某些测试表明该服务已启动,但如果您在此之后继续调用它,它仍有可能变得无法访问,因此实际上没有更好的选择。还添加了另一种 ping-target 动态 wsdl 文档的替代方法。
  • 它可能是也可能不是开销,但它也是不可靠的。 ping 可能成功,调用失败。或者 ping 可能失败,调用成功。因此,ping 基本上是没有意义的。实际通话的成败才是最重要的。
  • @EJP 正如您所说:“它可能是也可能不是开销”。如果是开销,那么 ping 其他“轻量级”资源可能是有利可图的。如果不是,“ping”本身也可能针对 web 服务,我从来没有说过它不可能是这样的(这就是为什么我到处引用“ping”这个词)。是的,在“ping”成功后,ws 调用可能会失败,但这里的主要目标只是测试 webapp 是否启动并运行,而不是检查成功的 webservice 调用的其他条件。
  • 我不确定您是否真正理解了这个问题。该应用程序可以处理上升或下降的 Web 服务,但在启动时需要它。而且我不希望用户在网络服务启动后重新启动应用程序的麻烦。所以这就是我最终所做的:在启动时检查,如果网络服务不可用,然后等待它并通过“ping”检查,一旦恢复正常启动。
【解决方案2】:

您必须始终解决客户端应用程序中的连接问题 - 不仅仅是启动,因此“ping”没有意义。这适用于任何类型的远程连接解决方​​案。

当需要调用服务时,只需调用它即可。如果它断开连接将失败,您可以通过适当的方式通知用户。无论您是否 ping,您都必须这样做,因为服务可能会在最后一次 ping 和您的实际通话之间消失。

当客户端处于活动状态时,远程服务可以上下任意次数。

【讨论】:

  • 是的。但是如何在不 ping 的情况下定期检查连接状态?
  • 你没有。只需在需要时尝试使用该服务。你不在乎它在你不需要时是否可用,当你确实需要它时,唯一可靠的测试方法就是使用它。
【解决方案3】:

您可以简单地从 var/log/..../access.log 查看日志 例如。 tail -f /var/log/apache2/access.log

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 2010-09-16
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多