2012-10-16 41 views
5

Tôi có một ứng dụng chuyển tệp đơn giản được chạy dưới dạng ứng dụng Java độc lập. Nó lấy các tệp từ điểm cuối SFTP và di chuyển chúng đến điểm cuối khác.Làm cách nào để tạo một ứng dụng Camel độc lập có thể tự động tắt?

Tệp sẽ bị xóa khỏi điểm cuối SFTP sau khi chúng được chuyển. Khi không còn tệp nào nữa, sẽ là lý tưởng để chương trình kết thúc. Tuy nhiên, tôi đã không thể tìm thấy một giải pháp mà tôi có thể bắt đầu Camel và đưa nó đến kết thúc có điều kiện (như khi không có tệp nào khác trong điểm cuối SFTP). Cách giải quyết của tôi hiện tại là bắt đầu Camel và sau đó có một giấc ngủ chính trong một thời gian rất dài. Người dùng sau đó phải giết các ứng dụng bằng tay (thông qua CTRL + C hoặc cách khác).

Có cách nào tốt hơn để ứng dụng chấm dứt sao cho ứng dụng tự động không?

Dưới đây là mã hiện tại của tôi:

Trong CamelContext (Spring App Context):

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

main() phương pháp:

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

Trả lời

5

Bạn có thể thay đổi bạn một cái gì đó tuyến đường như thế này:

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

Thông báo sử dụng sendEmptyMessageWhenIdle=true

Và đây là 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(); 
    } 
} 

Thật sự tôi không chạy mã này, nhưng nó sẽ làm việc như mong muốn.

Các vấn đề liên quan