2012-10-16 4 views
5

Ho una semplice applicazione di trasferimento file che viene eseguita come applicazione Java autonoma. Prende i file da un endpoint SFTP e li sposta su un altro endpoint.Come si fa un'applicazione autonoma Camel che può spegnersi automaticamente?

I file vengono eliminati dall'endpoint SFTP dopo essere stati trasferiti. Quando non ci sono più file rimasti, sarebbe ideale terminare il programma. Tuttavia, non sono stato in grado di trovare una soluzione in cui poter avviare Camel e portarlo a in modo condizionale (come quando non ci sono più file nell'endpoint SFTP). La mia soluzione è attualmente quella di avviare Camel e quindi avere il thread principale inattivo per un tempo molto lungo. L'utente deve quindi uccidere l'applicazione manualmente (tramite CTRL + C o altro).

Esiste un modo migliore per terminare l'applicazione in modo che venga eseguita automaticamente?

Qui di seguito è il mio codice corrente:

In CamelContext (primavera App Context):

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

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

risposta

5

si potrebbe cambiare si tratta qualcosa di simile a questo:

<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> 

Avviso utilizzando sendEmptyMessageWhenIdle=true

Ed ecco 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(); 
    } 
} 

In realtà non ho eseguire questo codice, ma dovrebbe funzionare, se lo desideri.