将javascript对象从一个频道传递到另一个频道

Posted

技术标签:

【中文标题】将javascript对象从一个频道传递到另一个频道【英文标题】:passing javascript object from one channel to other channel in mirth 【发布时间】:2013-07-17 07:51:40 【问题描述】:

Channel A 中,我将 XML 作为输入。下面提到的传入 XML:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bookstore>
<books>
<book>
<title>SpringInAction</title>
<NoOfCopies>10</NoOfCopies>
</book>
<book>
<title>HibernateInAction</title>
<NoOfCopies>8</NoOfCopies>
</book>
<book>
<title>JSFInAction</title>
<NoOfCopies>5</NoOfCopies>
</book>
<book>
<title>StrutsInAction</title>
<NoOfCopies>9</NoOfCopies>
</book>
<book>
<title>JSPInAction</title>
<NoOfCopies>4</NoOfCopies>
</book>
</books>
</bookstore>

我在 Source 的 Edit Transformer 中解析这个 XML 并制作 javascript 对象并将这个 JavaScript 对象放入一个通道映射中,如下所示:

var book=new Object();
book.title = msg['books']['book'][0]['title'].toString();
book.copies = msg['books']['book'][0]['NoOfCopies'].toString();
logger.info("book "+book);
channelMap.put("book",book);

现在我想将这个 JavaScript 对象从 Channel A 的目的地传递给其他 Channel B 并且 Channel B 接收这个 JavaScript 对象作为输入剩下的处理。在Mirth有可能吗?

我使用的是 Mirth 版本 2.2.1.5861。

【问题讨论】:

【参考方案1】:

可以使用全局通道映射传递对象。其他两个映射被持久化到数据库中,因此 Mirth Connect 引擎将它们序列化为字符串。但是,对于全局频道映射,您应该在脚本中处理上下文(顾名思义,它不仅存在于消息或频道上下文中)。

有一个使用全局通道映射here 传递对象的示例。

【讨论】:

小心使用全局地图。它不是每个实例的变量......它实际上是一个全局变量。一个通道的变化会改变另一个通道的值。如果您正在处理多条消息,那么您期望在通道 B 中的值可能已经在通道 A 中更改。全局变量非常适合配置类型设置。 也许 作为 Mutext 的一种类型 - 但我会避免使用全局变量以您概述的方式传递变量。正如我在回答中显示的那样,您最好进行序列化【参考方案2】:

在保存通道变量之前,将其序列化(json对象)。

在您的频道目标中,写出“book”变量。

所以是这样的:

在变压器中

var book=new Object();
book.title = msg['books']['book'][0]['title'].toString();
book.copies = msg['books']['book'][0]['NoOfCopies'].toString();
logger.info("book "+book);

var Jbook = JSON.stringify(book);
channelMap.put("Jbook",Jbook );

在目标模板中

$jbook

然后在接收通道上

var book = JSON.parse(msg.toString());

我没有验证这个代码,但它应该给你一个编码策略。

见Mirth Discussion about JSON

另外:请参阅我们的 HealthcareIT 项目提案area51.StackExchange。这是一个很好的问题。

【讨论】:

我刚刚发现,ChronoFish 是对的,JSON 对象应该被序列化,或者您可以将其用作消息模板本身。如果您执行 routeMessage,我无法让 JSON 对象在通道之间传递,但如果我将它序列化(转换为字符串),它就可以通过)。性能很棒,能够在 10 分钟内处理 100 MB 文件(每条记录是 5k 左右)。 (请注意,我必须使用消息分组 javascript 功能进行自己的解析才能获得此速度)。

以上是关于将javascript对象从一个频道传递到另一个频道的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Bitmap 对象从一个活动传递到另一个活动

无法将类的对象从一个活动传递到另一个活动? [复制]

将对象从一个私有方法传递到另一个私有方法

如何将不可打包的对象从活动传递到另一个活动?

Django 将选定对象从表单传递到另一个表单

WPF 将对象从窗口的用户控件传递到另一个窗口的用户控件