(已解决)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