2011-03-17 6 views

cevap

6

Web.xml dosyasına "ContextListener" ekleyebilirsiniz. Bu sınıfın bir örneği, Webb uygulaması WAR dağıtımı/başlatılmasıyla ilgili olduğunda oluşturulacaktır.

Bu kod, uygulama dağıtılana kadar çalışmaya devam edecek bir iş parçacığı başlatabilir.

Örnek: Herhangi bir örneğini göstermez sadece cevap beri eski soruyu Canlandırıcı http://www.javafaq.nu/java-example-code-233.html

+0

: Burada

benim çözüm mü? – ayyappa

+0

Bir işlemi başlatmak için System.exec dosyasını kullanabilirsiniz. Bu işlem, uygulama yapılmadığında veya kapsayıcı durduğunda bile çalışmaya devam eder. –

+0

Efendim, dağıtımından sonra arka planda sürekli olarak çalışabilen bir sunucu uygulamasını çalıştırmam gerekiyor .. bunu nasıl yaparım? baska öneri? – ayyappa

9

.

  1. ServletContextListener dinleyici ve yöntemlerini contextInitialized() ve contextDestroyed() Uygulanışı: Bir web uygulaması WAR devreye girmemiş/dağıtıldığı veya Tomcat her başlatıldığında kod özel bir parçasını çalıştırmak için

    /Gerekirse, durdu.

  2. Tomcat uygulamanızı bilmesini sağlayın. documentation'a göre, uygulama sınıfını dağıtım tanımlayıcısına ekleyebilir, WebListener ile ek açıklama ekleyebilir veya ServletContext'da tanımlanan addListener() yöntemlerinden birini kullanarak kaydedebilirsiniz.

    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); 
         } 
        } 
    } 
    

    ve web.xml üzere aşağıdaki (veya alternatif olarak, WebListener ek açıklama veya addListener() yöntemi kullanmak) ekleyin: Burada

(this post göre) bir örnektir

<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

ı Bazı kodları yalnızca uygulama (* .war) dağıtımında çalıştırmanın bir yolunu bulun: , en azından java servlet ile jarse uygulamaları için çalışır javax.ws.rs.core.Application kullanarak.

ApplicationConfig.java dosyasındaki uygulama (aşağıya bakın), uygulama dağıtımında çağrılan bir public getClasses yöntemini içerir. Bu nedenle, getClasses uygulamasına kod eklemek, uygulama dağıtımında yürütülmesine neden olur. Fark ettiğim tek mağara, bu fonksiyona iki kez garip geliyor, nedenini bilmiyorum, bu yüzden kodumun zaten çalışıp çalışmadığını öğrenmek için ApplicationConfig sınıfında global bir değişken ekledim. i ne yapmalıyım sonra sürekli çalıştırmak için o programı gerekiyorsa, o halde

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); 
    } 

}