可以做一个程序,用来启动tomcat,同时执行这个方法

解决方案 »

  1.   

    tomcat的配置文件里好象实现不了这个功能,只能初始化数据。
    服务器重启的时候方法就更实现不了了。不知道其他人有什么高见,听一下。
      

  2.   

    是怎样的定时任务?如果是可以独立出来的,把任务单独写一个后台程序运行,然后利用操作系统启动时执行功能或操作系统的定时执行任务功能(比如如果在windows下可以放到任务计划中)
      

  3.   

    写一个windows服务,如代码:
    #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;
    }
      

  4.   

    应该可以的,在tomcat的配置文件中配置一下就可以了。修改一下conf/web.xml和server.xml
      

  5.   

    应该可以的,在tomcat的配置文件中配置一下就可以了。修改一下conf/web.xml和server.xml
      

  6.   

    在weblogic下可以配置web.xml的内容:
          <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内也可以。
      

  7.   

    IceCraft(心淡情浓) 的方法可行。
    你可以在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里面写这个方法就可以了。
      

  8.   

    来晚了,可以在web.xml里面配置,上面已经说完了,可以实现的。
      

  9.   

    我用tomcar,没有方法么?
    <load-on-startup>1</load-on-startup>
    我已经式过了,在tomcat中好像不管用
      

  10.   

    呵呵,我这边正好又类似的问题。
    每个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,这样子就可以定时执行任务。
      

  11.   

    哦。这个只能达到你的不在页面执行的效果,随Tomcat启动而启动的效果。
    如果你要让它不随Tomcat的关闭而关闭的话。你把这个线程设置为demon线程试试。