`
ihuashao
  • 浏览: 4721487 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

监控一个web服务的讨论(如果weblogic服务死掉了,让其自动启动)

阅读更多

最近,我们的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服务的操作:
Runtime.getRuntime().exec( "cmd /c start C:\\bea\\user_projects\\domains\\HBEP\\autoStart.cmd");

html文件如下(采用xmlhttp给servlet发送xml命令):
<BODY>
<script language="javascript">
var XML="<root><test>ask</test></root>" //定义一个ask命令,发送给servlet
var XMLrestart="<root><test>restart</test></root>"
var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
var xmlDoc=new ActiveXObject("Msxml2.DOMDocument");


function readxml(myXML){//客户端xml的解析
xmlDoc.loadXML(myXML);
if(xmlDoc.parseError.line>0){
throw xmlDoc.parseError.reason;
}
var nodes= xmlDoc.selectNodes("/root/test");
for(var i=0;i<nodes.length;i++){
return(nodes.item(i).text);
}
}

function action(){//客户端和服务端的通讯
xmlHttp.open("post","http://127.0.0.1:7001/xmlhttpTest/UrlTestServlet",false);
xmlHttp.setRequestHeader("context-type","text/xml;charset=utf-8");
xmlHttp.send(XML);
var answerxml = xmlHttp.responseText;
if(readxml(answerxml))!='ok'{ //没有接到servlet的响应,认为weblogic关闭,则向tomcat的servlet发送"restart"命令
xmlHttp.open("post","http://127.0.0.1:8888/xmlhttpTest/UrlTestServlet",false);
xmlHttp.setRequestHeader("context-type","text/xml;charset=utf-8");
xmlHttp.send(XMLrestart);
var answerxmlFromWeblogic = xmlHttp.responseText;
}
}

</script>
<button onclick="action();">朝服务器传送xml,并接收服务器回应</button>
</BODY>
再在weblogic部署一个servlet,内容如下:
package com.lcl;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.dom4j.io.*;
import org.dom4j.*;


/**
* @author lcl
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/

public class UrlTestServlet extends HttpServlet {
private static final String CONTENT_TYPE = "text/xml;charset=utf-8";
//Initialize global variables
public void init() throws ServletException {
}
//Process the HTTP Get request


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
InputStream is=request.getInputStream();

SAXReader reader=new SAXReader();
Document doc=null;
try{
doc=reader.read(is);
} catch(Exception ex){
System.out.println(ex);
}
String[] s= getElementTexts(doc,"test");
out.println("<root>");
out.println("<test>");
out.println("ok");
out.println("</test></root>");
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}

private String getElementText(Document doc,String name){
return doc.getRootElement().element(name).getText();
}

private String[] getElementTexts(Document doc,String name){
List l=doc.getRootElement().elements(name);
Iterator it=l.iterator();
List l1=new LinkedList();
while(it.hasNext()){
Element e=(Element)it.next();
l1.add(e.getText());
}
return (String[])l1.toArray(new String[]{});
}

//Clean up resources
public void destroy() {
}
}

weblogic的web.xml更改如下(加servlet映射):

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>


<!-- JSPC servlet mappings start -->

<servlet>
<servlet-name>UrlTestServlet</servlet-name>
<servlet-class>com.lcl.UrlTestServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>UrlTestServlet</servlet-name>
<url-pattern>/UrlTestServlet</url-pattern>
</servlet-mapping>


<!-- JSPC servlet mappings end -->
<welcome-file-list>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
</web-app>

tomcat的servlet和weblogic的servlet类似,只是在收到restart命令后执行:
Runtime.getRuntime().exec( "cmd /c start C:\\bea\\user_projects\\domains\\HBEP\\autoStart.cmd");


ok,搞定了,现在可以高枕无忧了.
甚至可以做到weblogic和tomcat的互启动.
现在不用值班了.呵呵
特此存档.


分享到:
评论

相关推荐

    weblogic 开机自动启动

    Weblogic 作为一个流行的 Java 企业级应用服务器,通常需要在服务器启动时自动启动,以确保业务的连续性。然而,在 Windows 系统下,Weblogic 的自动启动却需要进行一些额外的配置。在这篇文章中,我们将详细介绍...

    weblogic linux 自动启动

    在`/etc/rc.d/init.d/`目录下创建一个名为`weblogic`的脚本,这是Linux启动服务的惯例。脚本中定义了环境变量,如`LC_ALL`用于设置字符集,`BEA_BASE`、`BEA_HOME`和`BEA_LOG`分别用于指定中间件基目录、用户项目域...

    weblogic监控 weblogic调优 weblogic版本区别 weblogic启动关闭脚本

    关闭脚本如`stopWebLogic.sh`或`stopWebLogic.cmd`,则会发送一个关闭请求到WebLogic服务器。在实际操作中,我们还可以通过添加参数来定制启动行为,比如 `-Dweblogic.management.username` 和 `-Dweblogic....

    WebLogic_Server监控

    **管理控制台(Console)**是WebLogic的核心管理界面,提供了一个基于Web的图形化工具,用于配置、启动、停止服务器,管理集群,配置服务如JDBC和JMS,设置安全性,部署和监控应用程序,查看日志等。管理员可以通过...

    通过nodeManager启动weblogic服务.doc

    NodeManager是WebLogic Server的一个组件,用于远程管理和监控受管服务器。其主要功能包括启动、停止、重启和监控服务器状态。配置NodeManager步骤如下: 1. **启动NodeManager**:在每个受管服务器的主机上,以...

    weblogic监控

    WebLogic服务的监控对于确保应用的稳定性和性能至关重要。以下是对WebLogic服务监控的一些关键点: 1. **WebLogic服务的监控**: - **内存监控**:通过WebLogic控制台的`Console -&gt; Server -&gt; myserver -&gt; ...

    weblogic的启动部署配置方法文档

    启动WebLogic服务器是进行Web应用部署的基础步骤之一。下面详细介绍启动WebLogic的具体操作流程: 1. **进入启动脚本目录**: - 使用`cd /opt/bea/user_projects/domains/4a_domain/bin`命令进入WebLogic的启动脚本...

    java实现自定义Weblogic监控

    java实现自定义Weblogic监控java实现自定义Weblogic监控java实现自定义Weblogic监控

    搭建web工程,部署weblogic开发环境。

    WebLogic Server是由Oracle公司提供的一个企业级Java EE应用服务器,它为构建、部署和管理企业级应用程序提供了强大的支持。以下是对这个主题的详细阐述: 一、Web工程概述 Web工程通常指的是基于Web技术开发的应用...

    jmx监控weblogic,tomcat,websphere源码

    首先,WebLogic是由Oracle公司提供的一个全面的企业级Java应用服务器,它支持JMX来暴露管理接口,允许管理员远程监控服务器的状态、配置以及执行管理操作。通过JMX,你可以获取到WebLogic服务器的运行时信息,如JVM...

    Weblogic12.1.3 Console模式配置“可服务实例自动迁移的动态集群”

    通过这些步骤,你已经成功配置了一个可服务实例自动迁移的动态集群。这个配置提高了WebLogic应用程序的可用性,使得在服务器故障时服务能够无缝地转移到其他健康的服务器上,从而保证了业务的连续运行。

    java jvisualvm 监控weblogic配置方法

    Java VisualVM 是一个强大的工具,用于监控和分析 Java 应用程序的性能。它自 JDK 1.6 版本起集成在 JDK 中,允许开发者和系统管理员监控和调试运行在本地或远程的 Java 应用程序。 - **环境需求**:Java VisualVM ...

    Linux下WebLogic开机启动设置

    这个启动脚本可以在系统启动时自动启动WebLogic,并将其置于后台运行,同时具备日志备份功能。下面我们将详细讨论如何实现这一目标,特别是针对Linux5(64位)环境下WebLogic的配置。 首先,你需要以root用户身份...

    Swagger(weblogic服务启动)

    WebLogic是由Oracle公司提供的一个企业级Java应用服务器,它支持Java EE(Enterprise Edition)标准,用于部署和管理各种Java应用程序,包括Web服务和企业信息系统。 Swagger的核心组件是Swagger-UI和Swagger-...

    BEA WebLogic 服务器管理

    **启动管理控制台**是通过管理服务器启动的一个关键步骤,它提供了图形化的用户界面,使得管理员能够轻松地创建、配置、监视和管理WebLogic域中的各种资源和服务。 **运行时对象与配置对象**是指在WebLogic Server...

    weblogic 服务器管理(中文版)

    WebLogic服务器管理是BEA Systems提供的一个强大工具,它涵盖了对Web应用程序和中间件环境的全面控制。WebLogic Server管理子系统由多个组件组成,包括域、管理服务器和受管服务器。域是WebLogic Server部署的基础...

    解决任Weblogic 在Linux启动慢的问题

    ### 方法一:修改 Weblogic 启动参数 可以在 Weblogic 启动参数中添加“-Djava.security.egd=file:/dev/./urandom”,这样可以 tell JVM 使用 /dev/urandom 作为随机数生成的源。这样可以解决 Weblogic 启动时的...

    web 云服务器 weblogic

    Web云服务器WebLogic是Oracle公司提供的一个企业级Java EE应用服务器,它在云计算环境中扮演着核心角色,为各种Web应用程序和服务提供运行环境。WebLogic Server(简称WLS)以其高效、稳定和可扩展性著称,是许多...

    java监控weblogic

    Java 是一种广泛使用的编程语言,Weblogic 是一款流行的应用服务器,而 Java 实现自定义 Weblogic 监控则是指使用 Java 语言来实现对 Weblogic 服务器的监控。本文将详细介绍如何使用 Java 实现自定义的 Weblogic ...

    zabbix_tomcat_weblogic监控模板.zip

    Zabbix作为一款强大的开源监控工具,因其高度可定制化和广泛的适应性而备受青睐。本文将详细探讨如何使用Zabbix自定义模板来监控Tomcat和WebLogic这两个常见的Java应用服务器。 首先,我们来看“zabbix_tomcat_...

Global site tag (gtag.js) - Google Analytics