【问题标题】:Biztalk XLANG transform() output the same random value in a loop inside Biztalk orchestrationBiztalk XLANG transform() 在 Biztalk 编排内的循环中输出相同的随机值
【发布时间】:2022-09-22 21:52:38
【问题描述】:

我写了一个映射来生成一个 HL7 消息头 (MSH)。 对于 MSH.10 段,根据定义应该是唯一的,所以我将以下内容放在我的地图中。

    public string MessageControlId()
    {
       //return System.DateTime.Now.ToString(\"yyyyMMddHHmmssffff\");


       string firstPart = System.DateTime.Now.ToString(\"yyyyMMdd\");
       string middlePart = new Random().Next( 1000, 9999 ).ToString();
       string lastPart = System.DateTime.Now.ToString(\"ffff\");
        
       return firstPart + middlePart + lastPart;
    }

然后在我的编排中,我在一个循环中多次调用标题映射。我的目标是生成多条 HL7 消息,每条消息都有自己的消息头和唯一的 MSH.10 值。

下面的代码基于Microsoft Biztalk XLANG 语法,它调用映射来转换并通过transform() 语句创建消息头。

tMapType = System.Type.GetType(msgBre.HeaderMapName);

transform (msgHeader) = tMapType(msgBilling);

但是,当我对此进行测试时,我看到生成了多个 HL7 消息,但其中许多消息的 MSH.10 段具有重复值。我在下面将它们分组为不同的颜色。

我希望每次都有单独的值,因为在我的代码中,我生成了一个介于 1000 和 9999 之间的随机数。另外,我还生成了千分之一秒的时间值。

你知道为什么会这样吗?我唯一的理论是,当我调用 transform() 函数时,它并没有真正调用地图来每次重新创建标题......这对我来说似乎是错误的。

更新:

感谢@hulihunskeli 的输入,我能够通过进入我在 Biztalk 中的编排来解决这个问题,就在循环重复之前,我添加了 200 毫秒的延迟,这似乎解决了这个问题。我想这是其中循环的处理时间太快以至于函数无法生成确保唯一编号的新对象的事情之一。

  • 为什么你的 firstPart 不包括时间嗯嗯?
  • @sqlab 这只是我的一个测试,我最初有 yyyyMMddHHmmssffff 但它产生了同样的问题,所以我尝试通过引入随机 4 位数字作为中间部分来调试它,但我仍然有同样的问题。这向我证明,每次我调用 transform() 时都没有运行
  • 为什么不只是有一个序列号而不是一个随机数?您可以在循环内增加该序列号。
  • @Dijkgraaf 我原来的 yyyyMMddHHmmssffff 是日期时间戳,精确到 4 位数字,我认为这足以捕获并生成唯一值。就您而言,循环处于我的编排级别,它调用要转换的标头映射,我不确定如何捕获编排计数器值并将其放置在映射中。
  • 使用区分字段,确保将默认值映射到字段,并在构造 & 之后有一个表达式,将值分配给字段。

标签: c# biztalk


【解决方案1】:

您正在使用 Random 对象,它是一个伪随机数生成器,因此它返回具有相同种子的相同数字序列。您没有明确地向构造函数提供种子,因此它使用基于系统时钟的默认种子。如果您使用默认种子在紧密循环中创建 Random 对象,则 next() 函数将多次返回相同的数字,我认为这就是这里发生的情况。

您应该明确地提供唯一种子或始终使用相同的 Random 对象(如果可能的话)。

【讨论】:

  • 我最初使用格式为 yyyyMMddHHmmssffff 的日期时间戳,它也有同样的问题。如果 Random 对象的行为符合您的建议,我不应该一直得到相同的值吗?相反,我得到的“一些”是相同的,有些是不同的。
  • 在 Random 的 C# 文档 (docs.microsoft.com/en-us/dotnet/api/system.random?view=net-6.0) 中指出:“在大多数 Windows 系统上,在 15 毫秒内创建的随机对象可能具有相同的种子值。”。因此,如果您在彼此相距几毫秒的时间内实例化 Random 对象,您将获得相同的种子,并因此获得相同的“随机”数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2012-10-19
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多