监控一个web服务的讨论(如果weblogic服务死掉了,…
2008-02-23 09:35:20来源:互联网 阅读 ()
最近,我们的Web服务老是自动的就死掉了,为此,头儿让我们几个轮流值班,时刻注视web服务,如果web服务死掉了,我们需要立刻启动它.
这个方法,又劳民又伤才.谁都不愿意值班,怎么办?
我想了一下,写个监控web服务的程序不就得了?
可以有多种监控方式:
1:传统桌面程序.
2:b/s的监控程序.
先试验一个传统桌面程序.
先做个试验:监控foxmail.exe是否运行,如果没有运行,就启动它.
在系统的进程列表中,foxmail.exe中的进程名称为foxmail.exe,如果有名称为foxmail.exe的进程,这进行任何动作,否则启动它.
//---------------------------------------------------------------------------
#include <VCl.h>
#pragma hdrstop
#include "Tlhelp32.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
try{
HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (SnapShot == INVALID_HANDLE_VALUE)
return;
PROCESSENTRY32 ProcessInfo;
ProcessInfo.dwSize=sizeof(ProcessInfo);
BOOL Status=Process32First(SnapShot,&ProcessInfo);
BOOL flag = false; //是否有foxmail.exe进程
while(Status)
{
if(AnsiString(ProcessInfo.szExeFile).LowerCase() == "foxmail.exe")
{
flag = true;
}
Status=Process32Next(SnapShot,&ProcessInfo);
}
AnsiString tempTime = FormatDateTime("yyyy,mm,dd,hh:nn:ss", Now());
if(!flag){
AnsiString Exename = "D:\\Program Files\\Foxmail\\Foxmail.exe";
ShellExecute(Handle,"open",Exename.c_str(),"","", SW_SHOW );
Memo1->Lines->Add("restart this program at " tempTime);
}
else{
Memo1->Lines->Add("running at " tempTime);
}
CloseHandle (SnapShot);
}catch(...){
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
这个程序可以成功监控foxmail.exe的运行,如果foxmail.exe停掉了,则自动启动它.
可是:我们的web服务程序在进程中为:Java.exe,并且有两个.怎么办?
有一个近似的方法:如果进程中有两个java.exe,则认为web服务良好,如果java.exe少于两个,则认为web停了,需要重新启动.
所以修改后得到如下程序:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
i = StrToInt(Edit1->Text); //i为全局变量,记录应该有的java数目,这里为2.
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
try{
HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (SnapShot == INVALID_HANDLE_VALUE)
return;
PROCESSENTRY32 ProcessInfo;
ProcessInfo.dwSize=sizeof(ProcessInfo);
BOOL Status=Process32First(SnapShot,&ProcessInfo);
int j = 0; //记录当前java.exe数目
while(Status)
{
if(AnsiString(ProcessInfo.szExeFile).LowerCase() == "java.exe")
{
j ;
}
Status=Process32Next(SnapShot,&ProcessInfo);
}
AnsiString tempTime = FormatDateTime("yyyy,mm,dd,hh:nn:ss", Now());
if(j<i){
AnsiString Exename = "C:\\bea\\user_projects\\domains\\HBEP\\autoStart.cmd";
ShellExecute(Handle,"open",Exename.c_str(),"","", SW_SHOW );
Memo1->Lines->Add("restart this program at " tempTime);
}
else{
Memo1->Lines->Add("running at " tempTime);
}
CloseHandle (SnapShot);
}catch(...){
}
}
似乎并不满意,因为任何一个java程序的运行,在系统的进程表中都叫java.exe.怎么办?(虽然我们的服务器上很干净,基本不运行其他的java程序).
采用另外的一个方法:XMLhttp技术:
我的想法是这样的:
我们的web服务器是weblogic,我在服务器上另外部署一个tomcat服务器,分别在两个web服务里面写一个Servlet,
然后写一个html文件(不需要步署),采用xmlhttp技术访问weblogic的servlet(假定为A),如果A有响应,则表明weblogic服务在运行,如果连续5次无响应,则
认为weblogic服务死掉了,此时给tomcat的servlet(假定为B)发送一个xml命令,让servlet执行启动weblogic服务的操作:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash