2011-04-18 17 views
6

मैं वसंत विन्यासअपाचे कैमल एफ़टीपी उपभोक्ता एक ही फाइल को लोड करता है बार-बार

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://camel.apache.org/schema/spring 
     http://camel.apache.org/schema/spring/camel-spring.xsd"> 

    <bean id="downloadLogger" class="com.thomsonreuters.oa.sdi.camel.DownloadLogger" /> 

    <bean id="fileFilter" class="com.thomsonreuters.oa.sdi.camel.IgnoreReadyFilesFilter" /> 

    <camelContext xmlns="http://camel.apache.org/schema/spring"> 
     <route> 
      <from uri="ftp://url_to_ftp?password=*******&amp;noop=true&amp;stepwise=false&amp;binary=true&amp;consumer.delay=10s&amp;recursive=true&amp;filter=#fileFilter" /> 
      <process ref="downloadLogger" /> 
      <to uri="file:data/outbox" /> 
     </route> 
    </camelContext> 

</beans> 

एफ़टीपी पक्ष में निम्नलिखित है मैं फ़ाइलों को जो मैं डाउनलोड करना चाहते के साथ 3 फ़ोल्डरों की है।

  1. एफ़टीपी पर फ़ाइलों पहली डेटा पुल उपभोक्ता पर (isntance 5 के लिए) की निश्चित राशि है गंतव्य फ़ोल्डर
  2. फ़ाइलें लोड करने के लिए दूसरा प्रयास पर इन फ़ाइलों को लोड करता है, FTP: मैं परिदृश्य निम्नलिखित हासिल करना चाहते हैं राज्य अब भी वही (5 फ़ाइलें) और ऊंट एफ़टीपी उपभोक्ता बस (नई फ़ाइलों के लिए जांच को छोड़कर) कुछ भी नहीं
  3. एफ़टीपी के लिए नई 2 फ़ाइलें आता है करता है, और इस डेटा पुल पर उपभोक्ता डाउनलोड केवल इन नए दो फ़ाइलों

फिलहाल मेरे वर्तमान समाधान हर बार सभी फ़ाइलों को डाउनलोड करते हैं जब मैं आर un dataload प्रक्रिया, मैं डुप्लिकेट के डाउनलोड को रोकने के लिए डाउनलोड की गई फ़ाइलों के बारे में जानकारी कैसे प्रबंधित कर सकता हूं (मेरा मतलब है कि पहले से ही एफटीपी से फाइलों की प्रतिलिपि बनाई गई है), मैं अपना खुद का फ़िल्टर लिख सकता हूं जो पहले से डाउनलोड की गई फाइलों को फ़िल्टर करेगा, लेकिन मुझे विश्वास है कि सुविधा में बनाया जाना चाहिए मुझे इस पर नियंत्रण मिलेगा (शायद idempotentRepository, वास्तव में मुझे यकीन नहीं है) ...

+0

ऊंट किस संस्करण का उपयोग कर रहे हैं? और 5 फाइलें वे एक ही फ़ोल्डर में हैं, या विभिन्न उप-फ़ोल्डरों में हैं? –

+0

ऊंट संस्करण 2.7.0 है। 3 उपफोल्डर्स के साथ 1 रूट निर्देशिका है, प्रत्येक सबफ़ोल्डर में फ़ाइलों की अलग-अलग संख्या हो सकती है। अधिक विशिष्ट होने के लिए मान लें कि एक उपफोल्डर में प्रारंभ में 5 फाइलें होती हैं और फिर इस फ़ोल्डर में 2 और फ़ाइलें आती हैं।और मैं उन फ़ाइलों को डाउनलोड करना चाहता हूं जो पहले से ही गंतव्य फ़ोल्डर में हैं। – endryha

+0

हम्म नोप = सत्य भी बेवकूफ को इंगित करेगा। लेकिन uri –

उत्तर

12

यदि आप चाहते हैं कि कैमेल को यह याद रखने में सक्षम होना चाहिए कि इसे पहले से कौन सी फाइलें डाउनलोड की गई हैं, तो पुनरारंभ के बीच। idempotentRepository

यहाँ अधिक विवरण देखें: http://camel.apache.org/file2

आप एफ़टीपी समाप्ति बिंदु पर इस विकल्प को निर्धारित करने की आवश्यकता (नोट:। एफ़टीपी घटक विरासत फ़ाइल घटक से विकल्प)

रहे हैं विकी पेज पर कुछ उदाहरण विभिन्न स्टोरों का उपयोग कैसे करें। और आप कस्टम स्टोर भी बना सकते हैं।

+0

धन्यवाद, यह वही है जो मैं प्राप्त करना चाहता हूं। – endryha

4

अंत में मैं निम्नलिखित समाधान के साथ अंत:

public class SdiRouteBuilder extends RouteBuilder { 
    @Override 
    public void configure() throws Exception { 
     from("ftp://[email protected]_to_ftp/RootFolder?" + 
       "password=******&noop=true&stepwise=false&binary=true&consumer.delay=10s&recursive=true&filter=#fileFilter") 
       .idempotentConsumer(header("CamelFileName"), FileIdempotentRepository.fileIdempotentRepository(new File("data", "repo.dat"))) 
       .process(new DownloadLogger()) 
       .to("file:data/outbox"); 
    } 
} 
+0

इस संकेत के लिए धन्यवाद। ऐसा लगता है कि सीधे ftp (फ़ाइल उपभोक्ता के लिए सेटिंग गुणों) के लिए काम नहीं करना है। यह केवल तभी काम करता है जब मार्ग पर idempotentConsumer का उपयोग कर। – dermoritz

1

शायद @endryha 2011 में अच्छी तरह से काम का जवाब नहीं, बल्कि ऊंट के साथ 2.20.1

कैमल 2.20.1 में, इन कोड दो पैदा करेगा idempotentRepository

  1. एफ़टीपी डिफ़ॉल्ट स्मृति idempotentRepository
  2. idempotentConsumer कस्टम idempotentRepository (फ़ाइल वीं में आधारित मामले)

तो सही उपयोग करने के लिए idempotentRepository है जिस तरह से (मैं पठनीयता के लिए सबसे पैरामीटर को निकालने)

"ftp://[email protected]_to_ftp/RootFolder?&idempotent=true&idempotentRepository=#myIdempotentRepo" 

और एक बीन

@Bean 
private IdempotentRepository<String> myIdempotentRepo() { 
    return FileIdempotentRepository.fileIdempotentRepository(new File("data", "repo.dat"); 
}