Как Enrich EIP на Apache Camel трябва да работи с крайни точки на файлове?

Опитвам се да науча как да използвам Apache Camel, като пиша прости маршрути, които използват различните EIP. Моят ментор предложи Apache ServiceMix като добър сървър за тестване на прости маршрути, така че използвам Apache ServiceMix 5.1.0. В момента се опитвам да направя маршрут, който чете заявка от файл, замества съдържанието на заявката с отговор от втори файл и записва този отговор в трети файл.

В идеалния случай вторият файл няма да бъде изтрит; В крайна сметка бих искал да използвам този модел в други маршрути за самообучение и вторият файл ще имитира отговора на уеб услуга. Обаче просто се опитвам да накарам това да работи в момента, така че не усложнявам нещата с опции като noop.

Ако съм прочел правилно страницата Apache Camel Wiki за Content Enricher, пропускайки агрегирането стратегия от enrich EIP ще накара Camel да отхвърли съдържанието на съобщението и да го замени с тялото, получено от ресурса. И така, реших, че този Camel Route ще направи това, което искам:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:camel="http://camel.apache.org/schema/blueprint" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route>
            <from uri="file:camel/inMessage/?fileName=replaceMe.txt" />
            <enrich uri="file:camel/storedResponse/?fileName=withThis.txt" />
            <to uri="file:camel/outMessage/?fileName=output.txt" />
        </route>
    </camelContext>

</blueprint>

Това, което всъщност се случва е, че съдържанието на camel/storedResponse/withThis.txt се заменя със съдържанието на camel/inMessage/replaceMe.txt. Файлът camel/outmessage/output.txt е създаден, но съдържа съдържанието на replaceMe.txt, а не на withThis.txt.

Тъй като все още съм нов в Camel, предполагам, че проблемът е просто в това, че съм прочел нещо погрешно в документацията или съм пренебрегнал очевиден проблем с конфигурацията.

Колкото и да си струва, ето съдържанието на файловете преди да започнете маршрута.

replaceMe.txt
This is the message sent. It should not appear in the response.

withThis.txt
This is the file stored in the server. The response should contain this text.

output.txt does not yet exist.

Ето съдържанието на файловете след завършване на маршрута.

replaceMe.txt has been deleted.

withThis.txt
This is the message sent. It should not appear in the response.

output.txt
This is the message sent. It should not appear in the response.

Благодаря ви за отделеното време.


person JacobMorleyCarson    schedule 04.12.2014    source източник


Отговори (2)


От Camel doc:

enrich използва Producer, за да получи допълнителни данни. Обикновено се използва за съобщения с искане за отговор, например за извикване на външна уеб услуга. pollEnrich от друга страна използва Polling Consumer за получаване на допълнителни данни. Обикновено се използва за съобщения за събития, например за четене на файл или изтегляне на FTP файл.

Ако използвате enrich, тогава съдържанието на withThis.txt се заменя със съдържанието на replaceMe.txt и това не е това, което искате. Използвайте pollEnrich вместо това:

 <pollEnrich uri="file:camel/storedResponse/?fileName=withThis.txt" />
person Peter Keller    schedule 06.12.2014
comment
Благодаря ви за отговора. Опитах по-сложен пример, където pollEnrich доведе до увисване на маршрута, така че се поколебах да го опитам отново. Това означава ли, че има грешка в документацията на Camel, където се казва, Стратегията за агрегиране не е задължителна. Ако не го предоставите, Camel по подразбиране просто ще използва тялото, получено от ресурса.? В този случай ресурсът е withThis.txt, но enrich игнорира съдържанието на ресурса. - person JacobMorleyCarson; 08.12.2014
comment
@JacobMorleyCarson Документацията е правилна: стратегията за агрегиране не е задължителна. Използвайте enrich за производител (to), напр. извикване на уеб услуга или писане на данни. Използвайте pollEnrich за потребител (from), напр. четене на данни от файл. - person Peter Keller; 08.12.2014
comment
И така, първото изречение, което цитирах от документацията на Camel, е правилно. Второто, което цитирах, казва, че ако не го предоставите, Camel по подразбиране просто ще използва тялото, получено от ресурса. Това е частта, която изглежда неправилна. Мисля, че ресурсът е крайната точка, дадена в маркера enrich; в този случай това е withThis.txt. Въпреки че в документацията се казва, че Camel ще използва тялото, получено от ресурса, Camel вместо това изхвърля тялото, получено от ресурса. - person JacobMorleyCarson; 08.12.2014
comment
@JacobMorleyCarson Но enrich не трябва да се използва за четене на файлове. - person Peter Keller; 08.12.2014
comment
Мисля, че разбирам какво не съм разбрал. Ако разбирам сега, enrich получава обмен. След това произвежда собствен обмен, който изпраща до крайната точка. Крайната точка file получава произведения обмен и го интерпретира, сякаш е в to таг. enrich след това изпраща всичко, което получава от своя uri атрибут - крайната точка file - до следващата част от маршрута. Изречението, което цитирах, се отнасяше за обмена, който enrich произвежда, но си помислих, че се отнася до обмена, който enrich получава. Благодаря ти за помощта. - person JacobMorleyCarson; 08.12.2014

enrich работи като към вашия маршрут всъщност записва тялото, получено от replaceMe.txt в withThis.txt, без да променя нищо в тялото. Следователно крайният резултат pollEnrich ще трябва да се използва за действително четене от withThis.txt

person Jérôme    schedule 19.12.2014