2013-04-11 5 views
6

मैं रीस्टफुल सेवा (सीएक्सएफआरएस घटक का उपयोग कर) लागू कर रहा हूं जो कुछ अनुरोधों के लिए फ़ाइलों को वापस कर सकता है। प्रत्येक फ़ाइल को उसकी आईडी और एक्सटेंशन द्वारा लाया जाता है, यानी restfulservice.com/path/file/1/pdf। एक बार जोड़ा गया प्रत्येक फ़ाइल कभी नहीं बदलती है। फ़ाइलों को लाने के बाद स्थानांतरित या हटाया नहीं जाना चाहिए और आम तौर पर उन्हें समवर्ती रूप से सुलभ होना चाहिए। यहाँ मेरी ऊंट संदर्भ का हिस्सा है:अपाचे कैमल अनुरोध पर फ़ाइल सामग्री के साथ संदेश को समृद्ध संदेश

from("direct:fetchFile") 
    .process(fetchFileProcessor) // set file.id & file.extension 
    .bean(fileService, "fetchFile(${header.file.id}, ${header.file.extension})") // set body to filename 
    .setHeader("CamelFileName", simple("${body}")) 
    .choice() 
     .when(header("file.extension").isEqualTo("xml")) 
      .pollEnrich("file:///{{application.fileStorage.basePath}}/xml?noop=true", 500) 
     .when(header("file.extension").isEqualTo("pdf")) 
      .pollEnrich("file:///{{application.fileStorage.basePath}}/pdf?noop=true", 500) 
    .end() 
    .convertBodyTo(File.class) 
    .bean(responseProvider, "getResponse(${body}, 200)"); 

इस विन्यास के साथ समस्या प्रतिक्रिया, केवल दूसरे (? क्यों) अनुरोध के लिए गैर खाली शरीर है कि समय समाप्ति सेट सेवा के बिना है डिबग के साथ दूसरे अनुरोध पर अनन्त पाश पर प्रवेश करती है संदेश

DEBUG o.a.c.c.f.FileConsumer - Took 0.000 seconds to poll <base path>\xml 

शीघ्रता कैमल संस्करण 2.10.4

है

किसी भी मदद की सराहना की जाएगी

UPD1:
Content Enricher पृष्ठ पर चेतावनी है, 'PollEnrich वर्तमान एक्सचेंज से किसी भी डेटा तक नहीं पहुंचता है'।
यह pollEnrich की तरह लगता है गतिशील fileName यूआरएल (link) में निर्दिष्ट समर्थन नहीं करते: लेकिन अगर मैं fileName=${body} जोड़ने यूआरएल

UPD2 दायर करने के लिए कुछ भी नहीं बदलता है। वर्तमान क्षण में रूट:

from("direct:fetchFile") 
    .process(fetchFileProcessor) // set file.id & file.extension 
    .bean(fileService, "fetchFile(${header.file.id}, ${header.file.extension})") // set body to filename 
    .choice() 
     .when(header("file.extension").isEqualTo("xml")) 
      .pollEnrich("file:///{{application.fileStorage.basePath}}/xml?fileName=${body}&noop=true", 500) 
      .setHeader("asset.type", simple(MediaType.APPLICATION_XML)) 
     .when(header("file.extension").isEqualTo("pdf")) 
      .pollEnrich("file:///{{application.fileStorage.basePath}}/pdf?fileName=${body}&noop=true", 500) 
      .setHeader("asset.type", simple("application/pdf")) 
    .end() 
    .convertBodyTo(File.class) 
    .process(multipartProcessor) // add file ass attachment to multipart body and set it as body 
    .bean(responseProvider, "getResponse(${body}, 200)"); 

UPD3
मैं गतिशील फ़ाइल नाम के साथ PollingConsumer उपयोग करने के लिए कस्टम प्रोसेसर को लागू करने की कोशिश कर रहा हूँ:

@Override 
public void process(Exchange exchange) throws Exception { 
    Long timeout = exchange.getIn().getHeader("file.timeout", Long.class); 
    if (enrichUri == null) { 
     throw new FileNotFoundException("'file.url' header not set"); 
    } 

    CamelContext context = exchange.getContext(); 
    Endpoint endpoint = context.getEndpoint(enrichUri); 
    PollingConsumer consumer = endpoint.createPollingConsumer(); 
    consumer.start(); 

    Exchange consumedExchange; 
    try { 
     if (timeout == null || timeout < 0) { 
      consumedExchange = consumer.receive(); 
     } else if (timeout == 0) { 
      consumedExchange = consumer.receiveNoWait(); 
     } else { 
      consumedExchange = consumer.receive(timeout); 
     } 
    } catch (Exception e) { 
     throw new AssetNotFoundException(e); 
    } finally { 
     consumer.stop(); 
    } 
    exchange.getIn().setBody(consumedExchange.getIn().getBody()); 
} 

अब यह पहली प्रतिक्रिया पर फ़ाइल की सामग्री देता है, लेकिन प्रत्येक सफल अनुरोध पर मुझे उपरोक्त लॉग संदेशों का शाश्वत पाश मिला:

DEBUG o.a.c.c.f.FileConsumer - Took 0.000 seconds to poll <base path>\xml 

UPD4
मैंने गतिशील मार्ग लागू किया है जो इसे संसाधित करने से पहले जोड़ा जाता है और हटा दिया जाता है। Apache Camel फ़ोरम में इस विधि को this पोस्ट में वर्णित किया गया है। रूट फाइल का उपभोग करने के लिए उपरोक्त प्रोसेसर का उपयोग करता है। परिणाम एक ही

उत्तर

9

सरल तरीका अक्सर सबसे अच्छा तरीका है। मैं इस मामले में अपाचे कैमल फ़ाइल घटक के साथ सौदा करने के लिए मना और प्रोसेसर निम्नलिखित कार्यान्वित:

public class FileLoadingProcessor implements Processor { 

@Override 
public void process(Exchange exchange) throws Exception { 
    String filename = exchange.getIn().getBody(String.class); // message body contains filename 
    String filePath = exchange.getIn().getHeader("fileprocessor.filepath", String.class); 

    if (filePath == null || filename == null) { 
     // throw some custom exception 
    } 

    URI uri = new URI(filePath.concat(filename)); 
    File file = new File(uri); 

    if (!file.exists()) { 
     throw new FileNotFoundException(String.format("File %s not found on %s", filename, filePath)); 
    } 

    exchange.getIn().setBody(file); 
} 

अब यह एक आकर्षण

+0

आप डीएसएल अपने कस्टम प्रोसेसर का उपयोग कैसा दिखता है दिखा सकते हैं की तरह काम कर रहा है? क्या चुनाव Enrich के लिए एक कस्टम प्रोसेसर पास करने का कोई तरीका है? – pimlottc

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