Как 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:

enrich использует Producer для получения дополнительных данных. Обычно он используется для обмена сообщениями «запрос-ответ», например, для вызова внешней веб-службы. pollEnrich, с другой стороны, использует Потребителя опроса для получения дополнительных данных. Обычно он используется для обмена сообщениями о событиях, например, для чтения файла или загрузки файла 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

обогащение работает как to Ваш маршрут фактически записывает тело, полученное из replaceMe.txt, в withThis.txt без каких-либо изменений в теле. Следовательно, окончательный результат pollEnrich необходимо будет использовать для фактического чтения из withThis.txt.

person Jérôme    schedule 19.12.2014