2012-10-16 12 views
5

मेरे पास एक साधारण फ़ाइल स्थानांतरण एप्लिकेशन है जो स्टैंडअलोन जावा एप्लिकेशन के रूप में चलाया जाता है। यह एक एसएफटीपी एंडपॉइंट से फ़ाइलें लेता है और उन्हें दूसरे एंडपॉइंट पर ले जाता है।मैं एक स्टैंडअलोन कैमल एप्लिकेशन कैसे बना सकता हूं जो स्वचालित रूप से बंद हो सकता है?

फ़ाइलों को स्थानांतरित करने के बाद एसएफटीपी एंडपॉइंट से हटा दिए जाते हैं। जब कोई और फाइल नहीं छोड़ी जाती है, तो यह प्रोग्राम आदर्श होगा कि कार्यक्रम समाप्त हो। हालांकि, मुझे कोई समाधान नहीं मिला है जहां मैं ऊंट शुरू कर सकता हूं और को सशर्त रूप से समाप्त कर सकता हूं (जैसे कि एसएफटीपी एंडपॉइंट में कोई और फाइल नहीं है)। मेरा कामकाज वर्तमान में ऊंट शुरू करने के लिए है और उसके बाद मुख्य धागा बहुत लंबे समय तक सो रहा है। उपयोगकर्ता को मैन्युअल रूप से एप्लिकेशन को मारना होगा (CTRL + C या अन्यथा के माध्यम से)।

क्या एप्लिकेशन को समाप्त करने का कोई बेहतर तरीका है कि यह स्वचालित रूप से ऐसा करता है?

CamelContext में (वसंत अनुप्रयोग प्रसंग):

नीचे मेरे वर्तमान कोड है

<route> 
    <from uri="sftp:(url)" /> 
    <process ref="(processor)" /> 
    <to uri="(endpoint)" /> 
</route> 

main() प्रणाली:

public static void main(String[] args) 
{ 
    ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    CamelContext camelContext = appContext.getBean(CamelContext.class); 

    try 
    { 
    camelContext.start(); 
    Thread.sleep(1000000000); // Runs the program for a long time -- is there a better way? 
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 

    UploadContentLogger.info("Exiting"); 
} 

उत्तर

5

आप इस तरह आप मार्ग कुछ बदल सकता है:

<route> 
    <from uri="sftp:(url)?sendEmptyMessageWhenIdle=true" /> 
    <choose> 
     <when> 
      <simple>${body} != null</simple> 
      <process ref="(processor)" /> 
      <to uri="(endpoint)" /> 
     </when> 
     <otherwise> 
      <process ref="(shutdownProcessor)" /> 
     </otherwise> 
    </choose> 
</route> 

यहाँ sendEmptyMessageWhenIdle=true

का उपयोग कर और सूचना shutdownProcessor

public class ShutdownProcessor { 
    public void stop(final Exchange exchange) { 
     new Thread() { 
      @Override 
      public void run() { 
       try { 
        exchange.getContext().stop(); 
       } catch (Exception e) { 
        // log error 
       } 
      } 
     }.start(); 
    } 
} 

वास्तव में मैं इस कोड नहीं चला है, लेकिन के रूप में वांछित यह काम करना चाहिए।

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

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