【问题标题】:mule data mapper with file attachment and smtp带有文件附件和 smtp 的 mule 数据映射器
【发布时间】:2015-07-08 23:38:16
【问题描述】:

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

我的骡子批次流程如下。

<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)我如何将有效负载数据从一步传递到完成?记录变量不起作用。

编辑

在 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>

【问题讨论】:

  • 对于 100 条记录(因为 commitSize 是 200),csv 文件的获取方式是多少。是“100”还是“1”?
  • @star,我做到了30。如果记录少于10,它不会在进程结束时提交?
  • 这就是我正在与您确认的内容。是加工吗?还是等待下一个 20?
  • 我重新测试了它。表有 73 条记录,但提交我指定了 200 条。在进程结束时生成的文件作为具有 73 条记录的单个文件。
  • 太棒了!我在下面给出了答案。

标签: mule


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

【讨论】:

  • 这很奇怪。即使总记录小于其提交大小,批处理提交仍应调用。我已经尝试过了,它对我有用。尝试调试.. 如果真的不起作用,只需将所有这些都放在批处理步骤中输入阶段,无论如何,您的批处理实际上并没有对每条记录做任何事情。
  • 很简单,双击DataMapper和近眼符号(Hide UnrelatedElement),就可以看到open Properties。单击它并启用标题(默认情况下,标题属性处于禁用状态)。如果需要,需要手动启用。
  • 按照星级建议尝试
猜你喜欢
  • 2013-10-31
  • 2017-05-11
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
相关资源
最近更新 更多