Мул скачать все файлы из ведра s3

<flow name="listobjects">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="listobjects" contentType="text/plain" doc:name="HTTP"/>
    <s3:list-objects config-ref="Amazon_S3" bucketName="demo"  doc:name="Amazon S3" maxKeys="5" />

   <!--  <payload-type-filter expectedType="java.util.List" doc:name="Payload"/> -->
    <foreach collection="#[payload]" doc:name="For Each">
   <!-- <foreach doc:name="For Each file"> -->
     <logger message=" inside foreach...... #[payload.getKey()]  ...." level="INFO" doc:name="Logger" />
        <s3:get-object-content config-ref="Amazon_S3" bucketName="demo" key="#[payload.getKey()]"  doc:name="Amazon S3"/>
        <object-to-byte-array-transformer/>
      <file:outbound-endpoint path="C:\output" responseTimeout="10000" doc:name="File" outputPattern="#[payload.getKey()] "></file:outbound-endpoint> 
    </foreach>
</flow>

У меня есть название ведра, которое называется demo. В этом ведре у меня есть 3 файла PDF. Я хочу скачать все файлы и положить его в папку c:\output.

Я нажал на мой URL-адрес, как http://localhost:8081/listobjects.

Но я получил ошибку:

Не удалось найти преобразователь для преобразования коллекции {type=org.mule.api.transport.OutputHandler, mimeType = '/'} ". (org.mule.api.transformer.TransformerException) (org.mule.api.transformer.TransformerException). Полезная нагрузка сообщения имеет тип: SimpleAmazonS3AmazonDevKitImpl$S3ObjectSummaryIterable

1 ответ

Ошибка возникает потому, что после foreach процессор полезная нагрузка является экземпляром класса S3, и вы не указали тип возвращаемого содержимого. Поэтому Мул пытается преобразовать экземпляр S3 в значение по умолчанию SimpleDataType и завершается неудачно. Один из способов решить это просто добавить что-то вроде

<set-property propertyName="Content-Type" value="application/json" doc:name="Content-Type" />
<set-payload value="{'result': 'ok'}"/>

в конце, чтобы сделать это явным.

Также обратите внимание, что в вашем потоке после запуска:

<object-to-byte-array-transformer/>

полезная нагрузка S3 исчезла, поэтому #[payload.getKey()] выйдет из строя в следующем процессоре:

  <file:outbound-endpoint path="C:\output" responseTimeout="10000" doc:name="File" outputPattern="#[payload.getKey()] "></file:outbound-endpoint> 

Я запустил это без проблем:

<flow name="listobjects">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8083" path="listobjects" contentType="text/plain" doc:name="HTTP"/>
    <s3:list-objects config-ref="Amazon_S3" bucketName="mule_test"  doc:name="Amazon S3" maxKeys="5" />
    <foreach collection="#[payload]" doc:name="For Each">
     <logger message=" inside foreach...... #[payload.getKey()]  ...." level="INFO" doc:name="Logger" />
        <set-variable variableName="fileKey" value="#[payload.getKey()]" doc:name="Variable" />
        <s3:get-object-content config-ref="Amazon_S3" bucketName="#[payload.getBucketName()]" key="#[payload.getKey()]"  doc:name="Amazon S3"/>
        <object-to-byte-array-transformer/>
      <file:outbound-endpoint path="/tmp" responseTimeout="10000" doc:name="File" outputPattern="#[flowVars.fileKey] "></file:outbound-endpoint> 
    </foreach>
    <set-property propertyName="Content-Type" value="application/json" doc:name="Content-Type" />
    <set-payload value="{'result': 'ok'}"/>
</flow>
Другие вопросы по тегам