2011-03-17 2 views

답변

6

web.xml에 "ContextListener"를 포함 할 수 있습니다. 이 클래스의 인스턴스는 Webb 애플리케이션 WAR이 전개/시작될 때 생성됩니다.

이 코드는 앱이 배포 될 때까지 계속 실행되는 스레드를 시작할 수 있습니다.

예 : 어떤 예를 표시하지 않는 유일한 대답 년부터 오래된 질문을 되살리는 http://www.javafaq.nu/java-example-code-233.html

+0

: 여기

내 솔루션입니다? – ayyappa

+0

System.exec을 사용하여 프로세스를 시작할 수 있습니다. 이 프로세스는 앱을 배포 취소하거나 컨테이너를 중지하더라도 계속 실행됩니다. –

+0

선생님, 배포 후 백그라운드에서 계속 실행할 수있는 서블릿을 실행해야합니다. 어떻게해야합니까? 어떤 제안? – ayyappa

9

.

  1. ServletContextListener 청취자와 그 방법 contextInitialized()contextDestroyed() 구현 : 웹 애플리케이션 WAR가 배포 취소/배포 또는 Tomcat이 시작될 때마다 코드의 사용자 지정 조각을 실행하기 위해

    는/당신이 필요 중지.

  2. 구현에 대해 Tomcat에 알리십시오. documentation에 따르면 구현 클래스를 배포 설명자에 추가하거나 WebListener이라는 주석을 달거나 ServletContext에 정의 된 addListener() 메서드 중 하나를 통해 등록 할 수 있습니다.

    package com.example; 
    import javax.servlet.ServletContext; 
    import javax.servlet.ServletContextEvent; 
    import javax.servlet.ServletContextListener; 
    
    public class MyServletContextListener implements ServletContextListener { 
        /** The servlet context with which we are associated. */ 
        private ServletContext context = null; 
    
        @Override 
        public void contextDestroyed(ServletContextEvent event) { 
         log("Context destroyed"); 
         this.context = null; 
        } 
    
        @Override 
        public void contextInitialized(ServletContextEvent event) { 
         this.context = event.getServletContext(); 
         log("Context initialized"); 
        } 
    
        private void log(String message) { 
         if (context != null) { 
          context.log("MyServletContextListener: " + message); 
         } else { 
          System.out.println("MyServletContextListener: " + message); 
         } 
        } 
    } 
    

    그리고 web.xml에 다음 (대안 적으로 또는 상기 WebListener 주석 또는 addListener() 방법 사용)를 추가한다 : 여기

은 (this post 기준) 일례이다

<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    ... 
    <listener> 
     <listener-class>com.example.MyServletContextListener</listener-class> 
    </listener> 
</web-app> 
0

을 난 응용 프로그램 (* .war) 배포시에만 일부 코드를 실행하는 방법을 찾으십시오. 자바 서블릿이있는 저지 서블릿에 적어도 작동합니다. javax.ws.rs.core.Application을 사용합니다.

파일 ApplicationConfig.java (아래 참조)에는 응용 프로그램 배포시 호출되는 public getClasses 메소드가 들어 있습니다. getClasses에서 코드를 추가하면 응용 프로그램 배포시 코드가 실행됩니다. 내가 알아챈 유일한 단점은이 함수가 이상하게도 두 번 호출된다는 것입니다. 왜 그런지 모르겠으므로 ApplicationConfig 클래스에 전역 변수를 추가하여 코드가 이미 실행되었는지 확인하십시오. 내가 어떻게해야합니까 후 지속적으로 실행하는 프로그램을 필요로하는 경우, 그럼

package eu.oca; 

import java.util.Set; 
import javax.ws.rs.core.Application; 

/**                                
*                                
* @author mattei                            
*/ 
@javax.ws.rs.ApplicationPath("jersey") 
public class ApplicationConfig extends Application { 

    private boolean alreadyRun = false; 

    @Override 
    public Set<Class<?>> getClasses() { 

     System.out.println("Sidonie : ApplicationConfig : getClasses : alreadyRun = " + String.valueOf(alreadyRun)); 
     alreadyRun = true; 
     Set<Class<?>> resources = new java.util.HashSet<>(); 
     addRestResourceClasses(resources); 
     return resources; 
    } 

    /**                               
    * Do not modify addRestResourceClasses() method.                   
    * It is automatically populated with                      
    * all resources defined in the project.                      
    * If required, comment out calling this method in getClasses().                
    */ 
    private void addRestResourceClasses(Set<Class<?>> resources) { 
     resources.add(eu.oca.ResultatGeneralAF.class); 
     resources.add(eu.oca.ResultatGeneralF.class); 
     resources.add(eu.oca.ResultatMesuresAF.class); 
     resources.add(eu.oca.ResultatMesuresF.class); 
     resources.add(eu.oca.SidonieAccueilD.class); 
     resources.add(eu.oca.SidonieWelcomeR.class); 
    } 

} 
관련 문제