一、场景 
近日有个项目客户要求能自己配置相关权限。由于历史原因这个项目采用的是公司以前的权限系统。这个权限系统很强大,不过有个弊端,就是每增加一个权限菜单都要重启才能生效,不然就要等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控制Tomcat启动关闭的实现方法的更多相关文章

  1. Tomcat启动失败的解决方法

    在使用Tomcat的时候,经常会遇到启动失败的问题:解决方法:1.检查环境变量的配置,jdk的配置2.检查端口是否被占用. 关于环境变量的配置很容易搜到,如果按照网上的教程配置好了,但是还是启动失败的 ...

  2. 关于form表单提交到Servlet的时候出现tomcat启动错误的解决方法

    1.遇到的问题 今天在写jsp代码的时候通过form表单提交到Servlet的时候出现的tomcat启动错误,琢磨了半天,终于找到了解决方法. 解决问题的关键就在于xml配置的路径和servlet中默 ...

  3. tomcat 启动 关闭 重启脚本

    启动 #!/bin/bash # Author:wanglan # Mail:@qq.com # Fuction:Tomcat Start/stop/restart script # Version: ...

  4. Linux下Tomcat启动关闭命令

    1.首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 2.查看Tomcat是否以关闭 ps -ef|grep tomcat 如果显示以下信息,说明Tomcat还没 ...

  5. Tomcat启动中文乱码解决方法

    一:解决方法一: 1.查看电脑系统的编码 针对Windows平台下,点击运行--输入cmd,enter键进入命令窗口,输入:chcp可以得到操作系统的代码页信息(代码页:字符集编码的别名),可以从控制 ...

  6. tomcat 启动闪退解决方法

    当我们在windows上面进行项目的部署与启动的时候有的时候tomcat在进行启动的时候会删一下就退了,这个时候一般是里面启动的时候设置的jdk的问题下面咱们来看一下具体解决方案 编辑我们的start ...

  7. Tomcat启动就执行特定方法

    import java.util.Timer; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContex ...

  8. tomcat启动完成执行 某个方法 定时任务(Spring)

    第一步引入接口: ServletContextListener @RestController @RequestMapping("/schedule") public class ...

  9. CentOS7.4 系统下 Tomcat 启动慢解决方法

    CentOS7.4 系统下 Tomcat 启动慢解决的方法   首先查看日志信息,查看因为什么而启动慢 在CentOS7启动Tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是s ...

随机推荐

  1. Android布局基础

    布局过程的含义 布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程. 布局过程的工作内容 两个阶段:测量阶段和布局阶段. 测量阶段:从上到下递归地调用每个 View 或者 ViewGr ...

  2. 【转】Spring的中IoC及AOP

    1. Spring介绍 Spring是轻量级的J2EE应用程序框架.Spring的核心是个轻量级容器(container),实现了IoC(Inversion of Control)模式的容器,Spri ...

  3. strtok()切割字符串函数

    #include <iostream> #include <string.h> using namespace std; char *my_strtok(char *dist, ...

  4. iOS/iphone开发如何为苹果开发者帐号APPID续费

    原文地址:iOS/iphone开发如何为苹果开发者帐号APPID续费作者:陈双超_群雄 其实相当的简单,这篇内容是给财务看的,有的地方连我自己看了都感觉有点...但如果不详细,她又要为难我,所以我就当 ...

  5. 华为无线ap3010dn-agn刷成胖ap

    刚买的华为ap3010dn-agn 版本为 v200R007C20SPC500  默认不带命令 ap-mode-switch [Huawei]dis version Huawei Versatile ...

  6. struts2中 JFreeChart使用

    添加3个包 struts2-jfreechart-plugin-2.3.16.3.jar jcommon-1.0.16.jar jfreechart-1.0.13.jar struts.xml中配置 ...

  7. SELinux 宽容模式(permissive) 强制模式(enforcing) 关闭(disabled)

    SElinux共有3中状态.1.selinux的配置文件:/etc/selinux/config# This file controls the state of SELinux on the sys ...

  8. poj 1113 Wall 凸包的应用

    题目链接:poj 1113   单调链凸包小结 题解:本题用到的依然是凸包来求,最短的周长,只是多加了一个圆的长度而已,套用模板,就能搞定: AC代码: #include<iostream> ...

  9. c++ friend 遇到 namespace 无法访问 private 成员的问题

    相关的文章(比较有意思,记录一下):http://www.cnblogs.com/lx20030303/archive/2012/09/21/2696258.html 先看例子.如下. 尝试编译的话, ...

  10. onActivityResult 通过case对不同情况进行处理

    @Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) { switch (result ...