BizTalk编排循环中transform()生成重复HL7 MSH.10值的问题
HL7消息MSH.10段重复原因分析
我编写了一个映射用于生成HL7消息头(MSH),为保证MSH.10段的唯一性,在映射中实现了生成唯一标识的代码。随后在BizTalk编排的循环中多次调用该映射,期望生成多个带有唯一MSH.10值的HL7消息,但测试发现大量消息的MSH.10值重复。经添加200ms延迟后问题解决,现询问该重复问题产生的原因。
映射代码
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; }
编排调用代码
tMapType = System.Type.GetType(msgBre.HeaderMapName); transform (msgHeader) = tMapType(msgBilling);
重复问题的核心原因
- Random实例种子重复:
new Random()默认以当前系统时钟作为种子。在循环高频率调用场景下,系统时钟的更新精度(Windows系统通常为10~15毫秒)跟不上调用速度,短时间内创建的多个Random实例会使用相同的种子,导致生成完全相同的随机数序列,middlePart值重复。 - 时间戳精度不足:
DateTime.Now.ToString("ffff")的毫秒后四位依赖系统时钟分辨率,短时间内多次调用时,lastPart的值不会发生变化;而firstPart在同一天内是固定值。当middlePart和lastPart同时重复时,最终生成的MessageControlId就会完全一致。 - 循环调用频率过高:BizTalk编排循环中调用映射的速度极快,远快于系统时钟的更新间隔,导致多次调用生成的标识各组成部分均无变化,最终出现大量重复。添加200ms延迟后,系统时钟有足够时间更新,Random实例的种子也会不同,从而避免了重复。
内容的提问来源于stack exchange,提问作者Fylix
相关产品推荐
相关产品推荐

