创建一个在失败时自动重新启动的Java服务器
我正在创建一个Java服务,它将在Web Servlet容器(可能是Tomcat)中运行。服务器的一部分将自行运行,不会由HTTP启动。我知道当HTTP调用导致异常时,Web容器可以再次调用它。创建一个在失败时自动重新启动的Java服务器
我想确保持续运行的服务器部分将继续运行,即使它失败了。我会处理我可以手动执行的任何故障,但如果全部失败,我希望重新启动它。有没有任何工具可以轻松实现?我已经在使用Spring和Tomcat,所以如果这些可以提供的话,那是理想的。如果不是,那么一个好的设计模式怎么样?
编辑:为了澄清,我有一个将在Tomcat中运行的Web服务。我想在该服务中运行一个单独的线程并设置它,以便当线程结束或出现未处理的异常时,Tomcat(或其他)检测到失败并重新启动Web服务。我知道web容器通常具有从某个外部调用开始的线程,从而处理来自这些线程的失败。我想要的是处理后台工作线程的东西。
如果您在Servlet中运行,那么按照J2EE规范,您无法重新启动容器,但是,您可以使用ScheduledExecutorService持续监视您的服务正在运行,如果没有,则重新启动它。
编辑。下面更多详细信息
您可以调用isTerminated()来检查服务是否仍在运行,如果队列为空,则可以调用add more tasks to it。
我在这里可能会误解你的问题,但你可能会过度思考它。
没有什么能阻止你在一台机器上运行多个Tomcat实例。然后,您可以让服务器A连接到服务器B,以便下拉信息(通过您选择的Web服务)。这可以减轻服务器A中断服务器的需求(这是我假设你试图避免的)。
这是通过绑定到单独的端口来隔离生产环境的常用方法。如果Tomcat不符合该服务的账单,您可以始终在[插入选择的操作系统]上将该应用程序作为服务运行,并通过专有协议连接到该服务。在这种情况下,您的操作系统可以处理重新启动。通常我认为多个Tomcat容器是最简单的方法,因为它安装简单并且相对容易设置。
祝你好运,它似乎是一个有趣的系统管理问题。您也可能有兴趣查看石英作业调度,因为这可能适合间歇性服务的账单。
编辑:更多一点细节可能会提供一些更详细的答案。
对您的设计不太清楚,但在我看来,您需要进行某种健康检查。
你可以用很多方式实现这样的机制,例如从这个始终运行的进程中打开一个套接字并定期发送消息。
如果没有回复,则处理失败。
您可以重新启动tomcat或实现一种机制来重新启动该进程。
不能告诉你更多的细节,因为你没有详细说明你想做什么。
更新: 我认为你应该使用JMX
。它由您已经使用的Spring
和Tomcat
提供。
只是让你想要监视一个托管资源的过程,另一个模块可以检查它是否还活着。
是的,我相信这是我正在寻找的。我非常有兴趣找到任何可以更容易执行的工具。理想情况下,这些工具将允许Tomcat(或任何Web容器)检测到我的Web服务失败并自动重新启动它。 –
请参阅答案中的更新 – Cratylus
“连续运行的服务器的一部分”就像是在服务器内部运行的单独线程一样吗? – Kashyap
我认为这将是一个单独的线程,但我接受其他方法。它可以按照自己的过程运行。 –
这个“其他服务”的生命周期是什么非常不明确。它是等待方法调用的单例还是正在运行的进程? –