带有文件附件和 smtp 的 mule 数据映射器

mule data mapper with file attachment and smtp

我的要求是从数据库中获取数据,转换成csv格式,发送一封带有csv附件的完整数据的电子邮件。

我的 mule 批处理流程如下。

<batch:job name="status-csv-smtp">
<batch:input>
    <db:select config-ref="Database_Configuration" doc:name="Database">
        <db:parameterized-query><![CDATA[select account_name , account_action ,employeed_id ,paytype_id , client_id , int_status , error_msg , logged_at from sfdc_status]]></db:parameterized-query>
    </db:select>
</batch:input>
<batch:process-records>
    <batch:step name="Batch_Step">
        <json:object-to-json-transformer doc:name="Object to JSON"/>            
        <batch:commit size="200" doc:name="Batch Commit">
            <data-mapper:transform config-ref="JSON_To_CSV" doc:name="JSON To CSV"/>
        </batch:commit>
    </batch:step>
    <batch:step name="Batch_Step1">
        <set-attachment attachmentName="status.csv" value="#[payload]" contentType="text/html" doc:name="SFDC Status"/>
        <smtp:outbound-endpoint host="${smtp.host}" port="${smtp.port}" connector-ref="SMTP" to="${smtp.to}" from="${smtp.from}"  subject="Upload status" responseTimeout="10000" doc:name="SMTP"/>
    </batch:step>
</batch:process-records>
<batch:on-complete>
    <logger message="#[message.payload]" level="INFO" doc:name="Logger"/>
</batch:on-complete>

这里的问题是 1) 如果有 100 条记录,则触发 100 封邮件,文件中的数据为空 2) 如果我将 smtp 和附件移动到完成,我将无法将 csv 文件作为附件 3)我如何将有效载荷数据从步骤传递到完成? recordVars 无效。

编辑

在 DataMapper 中选择选项后,我遇到了数据库映射问题,因为从输出重新创建元数据能够获得正确的数据。现在已将对象移除到 json 转换器。

我正在关注 link 以及@Tyrone Villaluna 的回复。我收到了多封基于批次提交大小 (30) 的电子邮件,如何获得包含整个记录的单个附件的电子邮件?它现在发送多封电子邮件,如果提交大小超过记录(比如 200),则电子邮件不会因提交大小而触发。我不确定数据库中是否存在记录。

<batch:job name="status-csv-smtp">
<batch:input>
    <db:select config-ref="PSI_Database_Configuration" doc:name="Database">
        <db:parameterized-query><![CDATA[select account_name , account_action ,employeed_id ,paytype_id , client_id , int_status , error_msg , logged_at from sfdc_status]]></db:parameterized-query>
    </db:select>
</batch:input>
<batch:process-records>
    <batch:step name="Batch_Step">
        <batch:commit size="30" doc:name="Batch Commit">
            <data-mapper:transform config-ref="List_Map__To_CSV_1List_Map__To_CSV_2" doc:name="List&lt;Map&gt; To CSV"/>
        <set-attachment attachmentName="status.csv" value="#[message.payload]" contentType="text/html" doc:name="SFDC Status"/>
        <smtp:outbound-endpoint host="${smtp.host}" port="${smtp.port}" connector-ref="SMTP" to="${smtp.to}" from="${smtp.from}"  subject="Upload status" responseTimeout="10000" doc:name="SMTP"/>
        </batch:commit>
    </batch:step>
</batch:process-records>
<batch:on-complete>         
    <logger message="#[payload.processedRecords],[payload.failedRecords] #[payload.elapsedTimeInMillis]" level="INFO" doc:name="Logger"/>
</batch:on-complete>

  1. 您是否尝试过将 Batch_Step1 的所有组件移动到 Batch_Step 的批量提交中?我认为 Batch Commit 正在清除记录(虽然不是特别确定)
  2. 是的,记录数据(包括流变量)在批处理完成时确实不可用。您只会在此处看到摘要。希望在未来的版本中可用。
  3. 您可以尝试一种肮脏的方法。在批处理步骤中,将数据存储在缓存中(使用消息 rootId 作为键)或静态变量,然后在完成时将其取回。