2011-03-17 18 views
6

क्या कोई विधि या एपीआई है जिसका मैं उपयोग कर सकता हूं ताकि जब भी मैं एक नई WAR फ़ाइल तैनात करूँ, कोड का एक हिस्सा निष्पादित होना चाहिए या शायद जब टॉमकैट शुरू होता है, तो संबंधित सर्वलेट को लगातार कुछ कोड शुरू या चलाने चाहिए।क्या हम कुछ कोड चला सकते हैं जब हम पहली बार WAR फ़ाइल को तैनात करते हैं?

उत्तर

6

आप web.xml में "ContextListener" शामिल कर सकते हैं। इस कक्षा का एक उदाहरण तब बनाया जाएगा जब Webb एप्लिकेशन WAR को तैनात/प्रारंभ किया जा रहा है।

यह कोड एक थ्रेड शुरू कर सकता है जो ऐप को तैनात किए जाने तक जारी रहेगा।

उदाहरण: http://www.javafaq.nu/java-example-code-233.html

+0

:

यहाँ मेरी समाधान है? – ayyappa

+0

आप प्रक्रिया को लॉन्च करने के लिए System.exec कर सकते हैं। ऐप बेरोजगार या कंटेनर बंद होने पर भी यह प्रक्रिया चलती रहेगी। –

+0

महोदय, मुझे एक सर्वलेट चलाने की ज़रूरत है जो इसकी तैनाती के बाद पृष्ठभूमि में लगातार चल सकती है .. मैं यह कैसे कर सकता हूं? कोई सुझाव? – ayyappa

9

केवल जवाब के बाद से एक पुराने सवाल को फिर से जीवित किसी भी उदाहरण नहीं दिखाती है।

आदेश जब भी एक वेब अनुप्रयोग युद्ध तैनात है/undeployed या बिलाव शुरू कर दिया है कोड की एक कस्टम टुकड़ा चलाने के लिए/बंद कर दिया, आप की जरूरत है:

  1. लागू ServletContextListener श्रोता और उसके तरीकों contextInitialized() और contextDestroyed()
  2. टॉमकैट को आपके कार्यान्वयन के बारे में बताएं। 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.Aplication का उपयोग कर।

फ़ाइल में आवेदन ApplicationConfig.java (नीचे देखें) में एक विधि सार्वजनिक getClasses है जिसे एप्लिकेशन परिनियोजन पर बुलाया जाता है। तो getClasses में कोड जोड़ने के परिणामस्वरूप इसे एप्लिकेशन परिनियोजन पर निष्पादित किया गया। मैंने देखा कि एकमात्र चेतावनी यह है कि अजीब बात यह है कि इस समारोह को दो बार बुलाया जाता है, पता नहीं क्यों, इसलिए मैंने एप्लिकेशन कॉन्फिग क्लास में एक वैश्विक चर जोड़ा है ताकि यह पता चल सके कि मेरा कोड पहले से चल रहा है या नहीं। अगर मैं उस प्रोग्राम लगातार तब चलाने के लिए मैं क्या करूँ आवश्यकता है, तो उसके बाद

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

} 
संबंधित मुद्दे

 संबंधित मुद्दे