Загрузка файла Mule ESB из строки URL

Итак, используя Mule ESB, я ищу в Bing определенные PDF-файлы. Затем я анализирую ответ JSON, чтобы получить URL-адрес местоположения файла. Теперь мне нужно получить файл и сохранить локально. Ниже то, что у меня есть до сих пор, но у меня такое чувство, что я все делаю неправильно. Как я могу завершить вариант использования?

У меня две проблемы:

1) Не могу понять, как удалить «http» из #[message.payload.Url] (поскольку конечная точка HTTP добавляет http к URL-адресу, который я передаю.

2) Не могу понять, как получить файл. Я даже не знаю, является ли конечная точка HTTP правильным вариантом. HTTP? Файл?

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:https="http://www.mulesoft.org/schema/mule/https" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="CE-3.3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd 
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.mulesoft.org/schema/mule/https http://www.mulesoft.org/schema/mule/https/current/mule-https.xsd 
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd ">
    <flow name="BingFlow1" doc:name="BingFlow1">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP"/>
        <https:outbound-endpoint exchange-pattern="request-response" host="api.datamarket.azure.com" port="443" path="Data.ashx/Bing/Search/v1/Web?Query=%27contract%20california%27&amp;WebFileType=%27PDF%27&amp;$top=50&amp;$format=Json" user="********" password="*****" doc:name="Bing"/>
        <json:json-to-object-transformer returnClass="java.util.Map" doc:name="JSON to Object"/>
        <expression-transformer expression="#[message.payload.d.results]" doc:name="Expression"/>
        <collection-splitter doc:name="Collection Splitter"/>
        <http:outbound-endpoint exchange-pattern="request-response" host="#[message.payload.Url]" port="80" method="GET" doc:name="HTTP"/>
        <file:outbound-endpoint path="/home/user/Documents/output" outputPattern="#[message.payload.ID].pdf" responseTimeout="10000" doc:name="File"/>
        <echo-component doc:name="Echo"/>
    </flow>
</mule>

person Thaneofife    schedule 17.10.2012    source источник


Ответы (1)


Я не смог протестировать поток, потому что необходимы некоторые учетные данные, но следующее должно вам помочь:

  • Используйте expression-transformer, чтобы удалить HTTP,
  • Ваш подход с http:outbound-endpoint, за которым следует file:outbound-endpoint, будет работать нормально,
  • Измените http:inbound-endpoint на one-way: невозможно вернуть что-либо разумное, поскольку поток выполнения разделяется.

Например, предполагая, что message.payload.Url разрешается в java.lang.String, вы можете использовать:

<expression-transformer expression="#[org.mule.util.StringUtils.substringAfter(message.payload.Url, 'http://')]" doc:name="Expression"/>
person David Dossot    schedule 18.10.2012
comment
Потрясающий. Я только что изменил входящую конечную точку на одностороннюю. Я возвращался к оставшемуся клиенту, но вы правы... У меня это повторяется в консоли, так что в этом нет необходимости. - person Thaneofife; 19.10.2012
comment
Как бы вы написали выражение, я добавил <expression-transformer expression="#[message.payload.Url]" doc:name="Expression"/> после разделителя коллекции, но я не уверен, как убрать http:// из URL. Можете ли вы привести пример или даже документацию, показывающую, как это сделать? Я не вижу этого в документах Mule. - person Thaneofife; 19.10.2012
comment
Для этого нет специального документа: это MEL (созданный на основе mvel.codehaus.org), который дает вам доступ к любому Объект Java, включая в данном случае org.mule.util.StringUtils полезный для работы со строками. Я соответственно пересмотрел свой ответ. - person David Dossot; 19.10.2012
comment
Как насчет использования Script Component для манипулирования строками? Я просто не понимаю, как именно использовать преобразователь выражений без написания класса java. - person Thaneofife; 19.10.2012
comment
Для этого нет необходимости в компоненте Script. Вы можете использовать преобразователь выражений без использования вспомогательного класса (но почему?), используя методы substring и indexOf класса java.lang.String. - person David Dossot; 20.10.2012
comment
Мне жаль, что я был таким нубом с Мулом. Я так привык использовать Pentaho и WSO2. Очень разные подходы. Итак, я знаю, что мои ссылки на объекты #[message.payload.Url]. Какой оценщик и выражение я хотел бы использовать, чтобы просто удалить http:// из начала строки по этой ссылке? - person Thaneofife; 20.10.2012
comment
Спасибо за вашу помощь в этом... Я также опубликовал еще одну проблему в конце потока по адресу: stackoverflow.com/questions/12982760/ - person Thaneofife; 20.10.2012