监控一个web服务的讨论(如果weblogic服务死掉了,…

2008-02-23 09:35:20来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

最近,我们的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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:jspSmartUpload上传下载全攻略(三、文件上传篇 )

下一篇:java.util包(一)