Asp.net控制Tomcat启动关闭的实现方法

 更新时间:2012年01月09日 21:55:02   作者:  
近日有个项目客户要求能自己配置相关权限。由于历史原因这个项目采用的是公司以前的权限系统
一、场景
近日有个项目客户要求能自己配置相关权限。由于历史原因这个项目采用的是公司以前的权限系统。这个权限系统很强大,不过有个弊端,就是每增加一个权限菜单都要重启才能生效,不然就要等1天它缓存过期后才生效。由于项目进度我们不可能将这个权限系统推翻重来。
  可行的方式是在管理员操作界面上增加权限系统重启按钮。这样客户在修改权限后可以很方便的重启Tomcat。
二、技术分析
由于管理员系统是基于.net的BS方式。所以我们要能通过网页控制Tomcat的关闭启动,并加载进管理员系统中。
  首先分析Tomcat的启动方式。在Tomcat6.0的bin目录下有两个批处理文件。startup.bat和shutdown.bat分别控制着Tomcat的启动和关闭。我们要控制Tomcat的启动关闭就得调用这两个批处理文件。
怎么调呢?在哪调呢?浏览器直接调那是不可能的。必须得在web服务器上部署个web页面,在服务端调用这两个命令。如果部署在权限系统内部那是最好的,不过这会产生一个问题,我们可以关闭Tomcat,但却无法启动。最终的方案是在同一台机子上部署个.net实现的webservice,通过这个webservice实现权限系统的启动和关闭。
三、具体实现
  在VS2008中创建一个web service项目。
  创建两个WebMethod。
  1.启动Tomcat方法
复制代码 代码如下:

/// <summary>
/// 启动权限系统
/// </summary>
/// <returns>true:成功;false:失败</returns>
[WebMethod]
public bool StartPM()
{
try
{
// 创建进程启动信息
ProcessStartInfo sinfo = new ProcessStartInfo(AppDomain.CurrentDomain.BaseDirectory + "start.bat");
// 获取系统环境变量
IDictionary dics = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine);
foreach (string key in dics.Keys)
{// 将系统环境变量加入新进程环境变量中
if (sinfo.EnvironmentVariables.ContainsKey(key)) continue;
sinfo.EnvironmentVariables.Add(key, dics[key].ToString());
}
// 不需要从系统外壳程序创建,直接从文件创建
sinfo.UseShellExecute = false;
Process.Start(sinfo);
}
catch (Exception ex)
{
//TODO: 写日志
return false;
}
return true;
}

.关闭Tomcat方法
复制代码 代码如下:

/// <summary>
/// 关闭权限系统
/// </summary>
/// <returns>true:成功;false:失败</returns>
[WebMethod]
public bool StopPM()
{
try
{
// 创建进程启动信息
ProcessStartInfo sinfo = new ProcessStartInfo(AppDomain.CurrentDomain.BaseDirectory + "stop.bat");
// 获取系统环境变量
IDictionary dics = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine);
foreach (string key in dics.Keys)
{// 将系统环境变量加入新进程环境变量中
if (sinfo.EnvironmentVariables.ContainsKey(key)) continue;
sinfo.EnvironmentVariables.Add(key, dics[key].ToString());
}
// 不需要从系统外壳程序创建,直接从文件创建
sinfo.UseShellExecute = false;
Process.Start(sinfo);
}
catch (Exception ex)
{
//TODO: 写日志
return false;
}
return true;
}

为了方便以后配置我有新建了两个bat文件。在这两个文件中分别做调用Tomcat的startup.bat和shutdown.bat的操作。具体如下:
  1.start.bat  
复制代码 代码如下:
K:\apache-tomcat-6.0.30\bin\startup.bat

  2.stop.bat
复制代码 代码如下:
K:\apache-tomcat-6.0.30\bin\shutdown.bat

四、总结
  整个开发过程中出现了无法找到CATALINA_HOME、JAVA_HOME环境变量的错误,那是因为父进程也就是web service的环境变量中并没有这两项,所以创建子进程时(子进程的环境变量继承于父进程)也没有这两项。只得从系统环境变量中获取环境变量重新添加进新启动的进程中。同时必须明确的是进程的工作目录不等于进程的启动目录。比如
复制代码 代码如下:
ProcessStartInfo sinfo = new ProcessStartInfo(AppDomain.CurrentDomain.BaseDirectory + "stop.bat");

如果去掉AppDomain.CurrentDomain.BaseDirectory将报无法找到stop.bat 的错误,就是因为工作目录和启动目录不一致导致。

相关文章

  • 如何限制asp.net中上传文件的大小的代码

    如何限制asp.net中上传文件的大小的代码

    maxRequestLength是控制上传大小得参数请求的最大大小(以千字节为单位)
    2011-10-10
  • .NET中的MassTransit分布式应用框架详解

    .NET中的MassTransit分布式应用框架详解

    MassTransit是一款优秀的分布式应用框架,可作为分布式应用的消息总线,也可以用作单体应用的事件总线,这篇文章主要介绍了.NET中的MassTransit分布式应用框架,需要的朋友可以参考下
    2022-10-10
  • 详解asp.net core重新加载应用配置

    详解asp.net core重新加载应用配置

    这篇文章主要介绍了asp.net core重新加载应用配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • .NET NativeAOT 用法指南

    .NET NativeAOT 用法指南

    NativeAOT是.NET 8中引入的一种编译方式,它将代码编译成原生代码,提高性能并节省资源,然而,NativeAOT也带来了一些问题,如反射依赖、泛型实例化等,本文详细介绍了如何使用NativeAOT以及如何解决这些常见问题,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • asp.net 更改gridview pageSize的方法

    asp.net 更改gridview pageSize的方法

    asp.net 更改gridview pageSize的方法,需要的朋友可以参考下。
    2011-07-07
  • asp.net 分页存储过程实例剖析心得

    asp.net 分页存储过程实例剖析心得

    最近修改了个分页存储过程,作为菜鸟,还是从中获益良多,这里就开始今天的分页之旅了
    2011-10-10
  • asp.net DropDownList 三级联动下拉菜单实现代码

    asp.net DropDownList 三级联动下拉菜单实现代码

    asp.net DropDownList 三级联动下拉菜单效果代码,需要的朋友可以参考下。
    2009-12-12
  • 一些.NET对多线程异常处理技巧分享

    一些.NET对多线程异常处理技巧分享

    多线程应用,在实际的项目或产品开发中,原则上来说,应该尽量避免,但是在强调用户体验的要求下或开发平台的限制下(如 Silverlight Socket 通讯),我们不得不用多线程。
    2010-04-04
  • ASP.Net Post方式获取数据流的一种简单写法

    ASP.Net Post方式获取数据流的一种简单写法

    这篇文章主要介绍了ASP.Net Post方式获取数据流的一种简单写法,本文直接给出代码实例,需要的朋友可以参考下
    2015-05-05
  • Asp.net后台把脚本样式输出到head标签中节省代码冗余

    Asp.net后台把脚本样式输出到head标签中节省代码冗余

    最近在学习开发服务器控件,其它就少不了为控件注册js和css之类的资源文件,或者直接注册纯脚本样式。其中就遇到如下问题     1、 注册的资源文件或纯脚本样式在生成的页面中都不在head标签中(当然这个不影响页面功能)     2、 一个页面使用多个一样的控件时,会出现重复输入(出现多余代码)
    2013-02-02

最新评论