(已解决)Mule 4 - 转换后发送有效负载到 Azure 文件共享
(solved) Mule 4 - Sending Payload After Transform to Azure File Share
获取 xml 并在添加日期后将其发送回 Azure 文件共享的简单流程。我正在使用 Azure Storage Connector.
使用流上传根目录中的文件失败,出现以下错误:
ERROR 2020-07-30 10:44:15,756 [[MuleRuntime].uber.03: [azure_test].azure_testFlow.BLOCKING @7dde3fa] org.mule.runtime.core.internal.exception.OnErrorPropagateHandler:
********************************************************************************
Message : File length must be greater than 0 bytes.
Element : azure_testFlow/processors/6 @ azure_test:azure_test.xml:33 (Upload file in root directory with stream)
Element DSL : <azure-storage:upload-file-in-root-directory-with-stream doc:name="Upload file in root directory with stream" doc:id="93b6bb01-c42c-454a-aaca-3c3325534b5d" config-ref="Azure_Storage_Config" target="payload">
<azure-storage:rootfile fileName="output" fileStream="#[payload]" shareName="dev"></azure-storage:rootfile>
</azure-storage:upload-file-in-root-directory-with-stream>
Error type : MULE:UNKNOWN
FlowStack : at azure_testFlow(azure_testFlow/processors/6 @ azure_test:azure_test.xml:33 (Upload file in root directory with stream))
--------------------------------------------------------------------------------
如图所示,有效负载位于前两个处理器(不包括记录器)之后的引号中。但是在转换消息之后引号消失了,当我单击更新值时...它是空的。这是否意味着 Transform Message 之后的输出负载不再在流中?如果是这样的话,我怎样才能使转换输出成为一个流呢?不过,转换后的记录器会在控制台中写入新的有效负载。
编辑:
这是输入文件:
<data>DATA</data>
XML 的流量:
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:azure-storage="http://www.mulesoft.org/schema/mule/azure-storage"
xmlns:file="http://www.mulesoft.org/schema/mule/file"
xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/azure-storage http://www.mulesoft.org/schema/mule/azure-storage/current/mule-azure-storage.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd">
<azure-storage:config name="Azure_Storage_Config" doc:name="Azure Storage Config" doc:id="ced6e7d8-da1c-4d1e-b02c-fb990de78ed1" >
<azure-storage:sas-token-config-connection accountName="account" sasToken="token"/>
</azure-storage:config>
<flow name="azure_testFlow" doc:id="bcb34135-5d34-4fd8-b794-1a6a668d6f53" >
<azure-storage:download-file-from-root-directory doc:name="Download file from root directory" doc:id="c3893681-5489-4ee0-8058-38b189895a01" config-ref="Azure_Storage_Config">
<azure-storage:root-file fileName="input" shareName="dev" />
</azure-storage:download-file-from-root-directory>
<logger level="INFO" doc:name="Logger" doc:id="183d3636-9ef6-4fb0-b144-c880949dda36" message='#[payload]'/>
<set-payload value="#[payload]" doc:name="Set Payload" doc:id="20769233-90e1-4c5c-9556-b8e582cd638c" mimeType="application/xml" encoding="UTF-8"/>
<logger level="INFO" doc:name="Logger" doc:id="62d02465-952a-4de2-9c9d-a8319f3ddb96" message="#[payload]" />
<ee:transform doc:name="Transform Message" doc:id="04150311-2a96-4215-b252-07a36c3b133e" >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
output application/xml writeDeclaration=false
---
{
data: payload.data ++ now() as String {format: "yyyyMMddHHmm"}
}]]></ee:set-payload>
</ee:message>
<ee:variables >
</ee:variables>
</ee:transform>
<azure-storage:upload-file-in-root-directory-with-stream doc:name="Upload file in root directory with stream" doc:id="9a2f25b6-270f-4cff-bc87-141d7e30147e" config-ref="Azure_Storage_Config">
<azure-storage:rootfile fileName="outputStream" fileStream="#[payload]" shareName="dev" />
</azure-storage:upload-file-in-root-directory-with-stream>
<file:write doc:name="Write" doc:id="f3dc6f68-06aa-4755-b9a6-09cad8224fb7" path="C:\Users\jespe\outputFile" />
<azure-storage:upload-file-in-root-directory doc:name="Upload file in root directory" doc:id="2ccac879-d196-41e1-8a64-58494421ee68" config-ref="Azure_Storage_Config">
<azure-storage:file fileName="outputFile" shareName="dev" path="C:\Users\jespe\outputFile" />
</azure-storage:upload-file-in-root-directory>
<file:delete doc:name="Delete" doc:id="852758e7-94e6-43e2-9421-285f1bb85f26" path="C:\Users\jespe\outputFile" />
</flow>
</mule>
删除了使用流上传文件之前的记录器。调试器仍然显示转换后的负载。
编辑 2:
@jan-h 的回答确实是解决方案。尽管在转换消息中设置 deferred=true 对我不起作用。必须在 File Upload with Stream 中设置。
看起来最后一个 DataWeave 转换返回了一个不可重复的流,所以它在记录器中被消耗了。尝试删除最后一个记录器以查看有效载荷是否出现。
如果能分享一下流程的XML就更好了。单从截图是无法理解它在做什么的。
只需将 deferred=true 添加到最后一个数据编织。
像这样:输出 application/xml deferred=true
获取 xml 并在添加日期后将其发送回 Azure 文件共享的简单流程。我正在使用 Azure Storage Connector.
使用流上传根目录中的文件失败,出现以下错误:
ERROR 2020-07-30 10:44:15,756 [[MuleRuntime].uber.03: [azure_test].azure_testFlow.BLOCKING @7dde3fa] org.mule.runtime.core.internal.exception.OnErrorPropagateHandler:
********************************************************************************
Message : File length must be greater than 0 bytes.
Element : azure_testFlow/processors/6 @ azure_test:azure_test.xml:33 (Upload file in root directory with stream)
Element DSL : <azure-storage:upload-file-in-root-directory-with-stream doc:name="Upload file in root directory with stream" doc:id="93b6bb01-c42c-454a-aaca-3c3325534b5d" config-ref="Azure_Storage_Config" target="payload">
<azure-storage:rootfile fileName="output" fileStream="#[payload]" shareName="dev"></azure-storage:rootfile>
</azure-storage:upload-file-in-root-directory-with-stream>
Error type : MULE:UNKNOWN
FlowStack : at azure_testFlow(azure_testFlow/processors/6 @ azure_test:azure_test.xml:33 (Upload file in root directory with stream))
--------------------------------------------------------------------------------
如图所示,有效负载位于前两个处理器(不包括记录器)之后的引号中。但是在转换消息之后引号消失了,当我单击更新值时...它是空的。这是否意味着 Transform Message 之后的输出负载不再在流中?如果是这样的话,我怎样才能使转换输出成为一个流呢?不过,转换后的记录器会在控制台中写入新的有效负载。
编辑:
这是输入文件:
<data>DATA</data>
XML 的流量:
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:azure-storage="http://www.mulesoft.org/schema/mule/azure-storage"
xmlns:file="http://www.mulesoft.org/schema/mule/file"
xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/azure-storage http://www.mulesoft.org/schema/mule/azure-storage/current/mule-azure-storage.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd">
<azure-storage:config name="Azure_Storage_Config" doc:name="Azure Storage Config" doc:id="ced6e7d8-da1c-4d1e-b02c-fb990de78ed1" >
<azure-storage:sas-token-config-connection accountName="account" sasToken="token"/>
</azure-storage:config>
<flow name="azure_testFlow" doc:id="bcb34135-5d34-4fd8-b794-1a6a668d6f53" >
<azure-storage:download-file-from-root-directory doc:name="Download file from root directory" doc:id="c3893681-5489-4ee0-8058-38b189895a01" config-ref="Azure_Storage_Config">
<azure-storage:root-file fileName="input" shareName="dev" />
</azure-storage:download-file-from-root-directory>
<logger level="INFO" doc:name="Logger" doc:id="183d3636-9ef6-4fb0-b144-c880949dda36" message='#[payload]'/>
<set-payload value="#[payload]" doc:name="Set Payload" doc:id="20769233-90e1-4c5c-9556-b8e582cd638c" mimeType="application/xml" encoding="UTF-8"/>
<logger level="INFO" doc:name="Logger" doc:id="62d02465-952a-4de2-9c9d-a8319f3ddb96" message="#[payload]" />
<ee:transform doc:name="Transform Message" doc:id="04150311-2a96-4215-b252-07a36c3b133e" >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
output application/xml writeDeclaration=false
---
{
data: payload.data ++ now() as String {format: "yyyyMMddHHmm"}
}]]></ee:set-payload>
</ee:message>
<ee:variables >
</ee:variables>
</ee:transform>
<azure-storage:upload-file-in-root-directory-with-stream doc:name="Upload file in root directory with stream" doc:id="9a2f25b6-270f-4cff-bc87-141d7e30147e" config-ref="Azure_Storage_Config">
<azure-storage:rootfile fileName="outputStream" fileStream="#[payload]" shareName="dev" />
</azure-storage:upload-file-in-root-directory-with-stream>
<file:write doc:name="Write" doc:id="f3dc6f68-06aa-4755-b9a6-09cad8224fb7" path="C:\Users\jespe\outputFile" />
<azure-storage:upload-file-in-root-directory doc:name="Upload file in root directory" doc:id="2ccac879-d196-41e1-8a64-58494421ee68" config-ref="Azure_Storage_Config">
<azure-storage:file fileName="outputFile" shareName="dev" path="C:\Users\jespe\outputFile" />
</azure-storage:upload-file-in-root-directory>
<file:delete doc:name="Delete" doc:id="852758e7-94e6-43e2-9421-285f1bb85f26" path="C:\Users\jespe\outputFile" />
</flow>
</mule>
删除了使用流上传文件之前的记录器。调试器仍然显示转换后的负载。
编辑 2:
@jan-h 的回答确实是解决方案。尽管在转换消息中设置 deferred=true 对我不起作用。必须在 File Upload with Stream 中设置。
看起来最后一个 DataWeave 转换返回了一个不可重复的流,所以它在记录器中被消耗了。尝试删除最后一个记录器以查看有效载荷是否出现。
如果能分享一下流程的XML就更好了。单从截图是无法理解它在做什么的。
只需将 deferred=true 添加到最后一个数据编织。 像这样:输出 application/xml deferred=true