C#编程处女行

这几天被Tomcat频繁的报告数据库异常、数据库处于不一致状态、违反协议搞得焦头烂额。

查阅遍了网上的相关资料,没有找到一个真正解决了问题的。而且诡异的是,这个问题是不时的出现的。而且哪怕是系统正在报告数据库异常,同样连接到同一台数据库服务器的本地测试服务则可以很正常的运行,让我对这种状况感到彻底无语了。好在这个异常虽然让整个系统陷入瘫痪,但是只需要重启Tomcat就可以恢复正常了。但是现在面临的难题是:客户也着重要求加强系统的稳定性了,为此专门找我谈话。所以,无论最后如何从根本上解决,起码我现在所需要做的是要先把表面工作做好。

于是最简单的办法就是写守护程序了。检查到数据库报错就马上重启Tomcat,本来像写一个服务,不过后来发现如果写Windows服务的话太难以测试了。于是只能退而求其次,写个控制台运用程序让它一直运行着就行了。

思路很简单:应用程序一打开,就开始不断的访问本机的HTTP地址,如果检查到页面报告异常,就重启Tomcat,如果没有异常,就过5分钟再检查一次。

因为是C#写作,不得不说操作Windows进程之类的应该很简单了,最终程序如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace RestartTomcat
{

    class Program
    {
        static void RebootTomcat()
        {
            System.Diagnostics.Process.Start("net", " stop \"Tomcat5\"");//关闭Tomcat进程
            System.Threading.Thread.Sleep(10000);//休息10秒钟
            System.Diagnostics.Process.Start("net", " start \"Tomcat5\"");
        }

        static void Main(string[] args)
        {
            HttpWebRequest request = null;
            HttpWebResponse response = null;
            string gethost = "http://localhost:8080";

            System.Console.WriteLine("Tomcat守护进程,启动于:"+System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

            while (true)
            {
                try
                {
                    request = (HttpWebRequest)WebRequest.Create(gethost);
                    request.Method = "GET";
                    request.KeepAlive = true;
                    request.AllowAutoRedirect = false;
                    response = (HttpWebResponse)request.GetResponse();

                    //获取页面信息
                    StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("GBK"));
                    string ss = sr.ReadToEnd();
                    if (ss.Contains("SqlMapClient"))
                    {
                        RebootTomcat();
                        System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+" 检测到Tomcat异常,重新启动Tomcat。");
                    }
                    request.Abort();
                    sr.Close();
                    response.Close();
                    ss = null;
                }
                catch (Exception)
                {
                    RebootTomcat(); 
                    System.Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 检测到Tomcat未能正常启动,重新启动Tomcat。");
                }
                System.Threading.Thread.Sleep(300000);//休息5分钟
            }
        }

    }
}

评论

发表评论

此博客中的热门博文

转一下关于Fuck的用法

远程记录OpenWRT日志

用OpenWRT打造自动翻墙路由器(详解篇)