可以做一个程序,用来启动tomcat,同时执行这个方法
解决方案 »
- 基于Tomcat服务的java.lang.OutOfMemoryError: Java heap space异常?求助高手..
- 急!!!!启动tomcat的时候就报net.bull.javamelody.SessionListener错噢
- 一个算法,求解。
- struts2 警告:Could not find action or result
- 一个关于页面向webwork传值的问题
- ibatis select count(*) 问题
- 寻找深圳科技园附近的兼职人员
- win2003+iis6+tomcat5+jk2配置出错
- 大家救命,在线等,hibernate问题
- EJB实现查询的功能?
- 读图片后得到InputStream对象,如何从inputStream中获取图片的长宽呢?
- Tomcat 下载地址?
服务器重启的时候方法就更实现不了了。不知道其他人有什么高见,听一下。
#include "stdafx.h"
#include "iostream"
#include "stdafx.h"
#include "winsvc.h"
#include <atlbase.h> //CRegKey类需要的头文件
#include <Afxtempl.h> //CArray类需要的头文件
#include <tlhelp32.h> //ToolHelp函数需要的头文件
#include "math.h"using namespace std;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
SERVICE_STATUS_HANDLE ssh;
SC_HANDLE scm,svc;
SERVICE_STATUS ss;
CArray<PROCESSENTRY32,PROCESSENTRY32 &> m_PEArray;
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
void WINAPI Handler(DWORD Opcode);
void InstallService();
UINT jiankong(LPVOID lpvoid); int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
SERVICE_TABLE_ENTRY ste[2];
//线程入口表
ste[0].lpServiceName="load"; //线程名字
ste[0].lpServiceProc=ServiceMain; //线程入口地址
//可以有多个线程,最后一个必须为NULL
ste[1].lpServiceName=NULL;
ste[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(ste);
InstallService();
}
return nRetCode;
}
//安装并启动服务
void InstallService()
{
LPTSTR lpSysPath=new char[MAX_PATH];
::GetSystemDirectory(lpSysPath,MAX_PATH);
LPCTSTR lpsysfilename;
lpsysfilename=(LPCTSTR)lstrcat(lpSysPath,"\\LoadUpdateServer.exe"); //程序名称
scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL)
svc=CreateService(scm,"load","load",SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS |SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,lpsysfilename,NULL,NULL,NULL,NULL,NULL);
if(svc!=NULL)
svc=OpenService(scm,"load",SERVICE_START);
if (svc!=NULL)
{
StartService(svc,0,NULL);
CloseServiceHandle(svc);
}
CloseServiceHandle(scm);
}
//服务的真正入口点函数
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
ss.dwServiceType = SERVICE_WIN32;
ss.dwCurrentState = SERVICE_START_PENDING;
ss.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
ss.dwServiceSpecificExitCode = 0;
ss.dwWin32ExitCode = 0;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
ssh=RegisterServiceCtrlHandler("load",Handler);
ss.dwCurrentState = SERVICE_RUNNING;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus(ssh,&ss);
AfxBeginThread(jiankong,NULL,NULL); //开始一个工作线程实现程序功能
ss.dwCurrentState = SERVICE_RUNNING;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus(ssh,&ss);
}
//处理服务要求
void WINAPI Handler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP:
ss.dwCurrentState =SERVICE_STOPPED;
SetServiceStatus (ssh,&ss);
break;
case SERVICE_CONTROL_CONTINUE:
ss.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (ssh,&ss);
break;
case SERVICE_CONTROL_PAUSE:
ss.dwCurrentState = SERVICE_PAUSED;
SetServiceStatus (ssh,&ss);
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
SetServiceStatus (ssh,&ss);
} //在进程列表中监控邮箱进程的线程函数
UINT jiankong(LPVOID lParam)
{
CString sPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer ();
int nPos = 0;
nPos = sPath.ReverseFind('\\');
CString str = sPath.Right(sPath.GetLength()-nPos-1); // 不含路径的升级文件名
sPath = sPath.Left (nPos);
while(true){
CString value;
GetPrivateProfileString("loadConfig","startTime","3",value.GetBuffer(MAX_PATH),MAX_PATH,sPath+"\\loadConfig.ini");
//应该启动时间
int hourStart=atoi(value);
CTime time=CTime::GetCurrentTime();
//当前时间
int hourNow=time.GetHour();
//如果当前时间与启动时间差不超过1,那么启动程序
//if(fabs(hourStart-hourNow)<1){
if(fabs(hourStart-hourNow)<=2){
STARTUPINFO si;
PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) ); // Start the child process.
if( !CreateProcess( NULL, // No module name (use command line).
TEXT("LoadUpdateService.exe"), // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
CString logMessage;
int year=time.GetYear();
int month=time.GetMonth();
int day=time.GetDay();
int minute=time.GetMinute();
logMessage.Format("%d年%d月%d日%d:%d",year,month,day,hourNow,minute);
CString errorMessage;
errorMessage.Format( "CreateProcess failed (%d).\n", GetLastError() );
WritePrivateProfileString("log",logMessage,errorMessage,sPath+"\\loadConfig.ini");
continue;
} // Wait until child process exits.
//WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread ); }
::Sleep(14400000); //1000*60*60*4,四个小时
//::Sleep(14400000);
//::Sleep(1000*30);
}
return 1;
}
<servlet>
<servlet-name>InitServlet</servlet-name>
<display-name>InitServlet</display-name>
<description>this is a init servlet</description>
<servlet-class>com.init.InitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>InitServlet</servlet-name>
<url-pattern>/servlet/InitServlet</url-pattern>
</servlet-mapping>
这样,服务器在启动的时候就会执行这个servlet了,把你要处理的内容放在这个servlet中进行就可以了。如果你使用struts框架,它有一个plug-in的组件,可以实现在服务器启动的时候执行一个plugin类的方法,把你的处理内容放在plug-in内也可以。
你可以在web.xml里面配置。 <servlet>
<servlet-name>InitDaemon</servlet-name>
<servlet-class>com.websurfia.wap.wapgame.ChtInitDaemon</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>然后在这个servlet里面写这个方法就可以了。
<load-on-startup>1</load-on-startup>
我已经式过了,在tomcat中好像不管用
每个tomcat的应用有一个web.xml文件。
在里面可以配置ContextLinstner。这个会随Tomcat的启动而启动。
tomcat重启以后它也重启。
不知道行不行?
具体的方法:
<web-app>
<listener>
<listener-class>my.TreeServerContextListener</listener-class>
</listener>
</web-app>
--------------------------------------------
然后你写一个TreeServerContextListener放在WEB-INF目录的classes目录下。
例子:
public class TreeServerContextListener implements ServletContextListener
{
private TreeServerDataManager dataManagerThread = null;
public TreeServerContextListener()
{
dataManagerThread = TreeServerDataManager.getInstance();
}
public void contextInitialized(ServletContextEvent sce)
{
System.out.println("-----------------Init-------------------");
dataManagerThread.start();
}
public void contextDestroyed(ServletContextEvent sce)
{
dataManagerThread.close();
System.out.println("-----------------Destroy-----------------");
}
}
----------------------------------------------------------------------------------
其中dataManagerThread 我的为一个线程。
你可以换成TimeTask,这样子就可以定时执行任务。
如果你要让它不随Tomcat的关闭而关闭的话。你把这个线程设置为demon线程试试。