在执行批处理的 Mirth 通道中缓存结果

Cache results in a Mirth channel that performs batch processing

我在 Mirth 中遇到了一个问题。我有一个 Mirth 频道,它将接收一个 .csv 文件,我正在该频道中执行批处理。因此,通道将读取 .csv 文件中的每一行。我正在沟通每一行并转换为 SOAP 以与另一端进行沟通。这工作正常。

我想再次合并 .csv 文件中的所有行并创建一个新的 .csv 文件并将其作为附件发送给发件人。我想出了一种附加 .csv 文件并发送邮件的方法。但是我无法在同一个通道中合并行(缓存行结果)。

请告诉我该怎么做?

我不确定这是否可行。您是否考虑过将该行保存到一个文件(附加每一行),并将另一个频道作为文件 reader 来获取该文件?确保将时效设置为一分钟,这样它就不会在写入文件时抓取文件。

当然,这在一个频道内在技术上是可行的,但您必须愿意在内存中缓存消息,以便您可以在最后将它们全部合并发送。

在您的部署脚本中,初始化地图:

if (!globalChannelMap.containsKey('csvMap')) {
    $gc('csvMap', Maps.map());
}

在您的预处理器中,将每条消息添加到合并的 CSV 文件中(基本上取消批处理您的批处理消息):

var csvMap = $('csvMap');
var batchId = $('batchId');
if ($('batchSequenceId') == 1) {
    csvMap.put(batchId, new java.lang.String(message));
} else {
    csvMap.put(batchId, csvMap.get(batchId).concat(message));
}
return message;

然后在您的 SMTP 发件人目标上添加过滤规则,使其仅在处理批处理中的最后一封邮件时触发:

在同一目标上,添加一个转换器步骤,将合并的 CSV 从全局通道映射中拉出并将转换后的数据设置到它:

msg = SerializerFactory.getSerializer('DELIMITED').toXML($('csvMap').remove($('batchId')));

好了。您的频道将继续一次处理一行,但当它批量处理 last 行时,它也会触发另一个目的地。我将附上频道(从 3.5.0 导出)以供说明:Example - Consolidate CSV.xml

当然,另一种可能更明智的方法是将其分成两个通道。上游渠道不做任何批处理,但发送到您的下游渠道以及发送该电子邮件。下游通道将启用批处理,这就是您移动 Web 服务发送器的地方。