BizTalk 2010 - 创建确认

时间:2013-12-03 14:47:59

标签: biztalk biztalk-2010 hl7 btahl7

信息:

incomming消息的类型为HL7。我在接收管道中使用“Flafile-Disassembler”而不是“BTAHL7 2.x反汇编程序”管道组件,因为HL7-Schema有点修改而BTAHl7反汇编程序拆分消息(多部分消息)我们不要我们不想使用编排。

的问题:

如何在BizTalk 2010中的接收管道中创建确认,而不使用“BTAHL7反汇编程序”(不拆分 - >多部分消息方法)?

或者,可以防止在BTAHL7反汇编程序管道组件中拆分消息?

肯定的ACK就足够了。

感谢。

3 个答案:

答案 0 :(得分:1)

回答具体问题:

HL7 ack是HL7反汇编程序的特定功能。你必须创建自己的自定义反汇编程序组件,在内部运行ffdasm,并生成你自己的ack来模拟HL7反汇编程序的行为。

不,我不知道防止HL7反汇编程序创建多部分消息的方法。您可以轻松地重新组合在业务流程中执行的Map中的段。

答案 1 :(得分:1)

正如@boatsel所说,你不能阻止HL7反汇编程序创建多部分消息。

对于您的其他问题:您可以创建自定义管道组件以发回HL7确认,然后只使用您自己的平面文件架构(使用开箱即用的平面file disassembler pipeline component)。 / p>

1。使用双向接收端口。

这应该使用双向端口,即使使用MLLP适配器,但您需要验证并测试所有内容,并了解Microsoft可能支持也可能不支持使用MLLP适配器而不使用HL7 2.X反汇编程序管道或使用BizTalk以下面建议的方式。

2。关联请求和响应。

您需要在接收位置的管道中使用自定义管道组件,以使BizTalk为响应创建订阅。使用Pipeline Component Wizard开始创建组件。

在自定义管道组件类的Execute method中(通过实现IComponent interface获得),写下类似于下面代码的内容。

public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(Microsoft.BizTalk.Component.Interop.IPipelineContext pc, Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
{
    const string sysPropertyNamespace = "http://schemas.microsoft.com/BizTalk/2003/system-properties";
    var epmToken = inmsg.Context.Read("EpmRRCorrelationToken", sysPropertyNamespace);
    var correlationToken = epmToken != null
                                    ? (string) epmToken
                                    : Guid.NewGuid().ToString();
    inmsg.Context.Promote("EpmRRCorrelationToken", sysPropertyNamespace, correlationToken);
    inmsg.Context.Promote("RouteDirectToTP", sysPropertyNamespace, true);
    return inmsg;
}

this MSDN blog post中记录了没有业务流程的请求 - 响应消息处理的使用或EpmRRCorrelationTokenRouteDirectToTP属性。

3。创建并发送确认

您可以在发送管道中使用另一个自定义管道组件,以根据输入消息手动创建确认,可能还有一些在运行时读取的其他管道组件配置。

与第一个自定义管道组件类似,您可以实现IComponent接口的Execute方法。像这样的代码应该有效:

public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(Microsoft.BizTalk.Component.Interop.IPipelineContext pc, Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
{
    string msgOut;
    var bodyPart = inmsg.BodyPart;
    if (bodyPart == null) 
        return inmsg; // Maybe throw an exception instead?
    var inboundStream = new ReadOnlySeekableStream(bodyPart.GetOriginalDataStream());
    inboundStream.Position = 0;

    using (var reader = new StreamReader(inboundStream))
    {
        var builder = new StringBuilder();
        // Read the input stream's first line - this should be the MSH segment:
        var firstLine = reader.ReadLine();
        // TODO: read search/replacement values from pipeline configuration
        // TODO: make a better ACK header than this
        builder.AppendLine(firstLine.Replace("ADT^A01", "ACK")); 
        // Construct your acknowledgement segment, preferably without hardcoding it here:
        builder.AppendLine("MSA|AA|ADT^A01");
        msgOut = builder.ToString();
    }

    // Write out the output
    var outputStream = new VirtualStream();
    var writer = new StreamWriter(outputStream, Encoding.Default);
    writer.Write(msgOut);
    writer.Flush();
    outputStream.Seek(0, SeekOrigin.Begin);

    inmsg.BodyPart.Data = outputStream;

    pc.ResourceTracker.AddResource(inboundStream);
    pc.ResourceTracker.AddResource(outputStream);

    return inmsg;
}

除了处理内联TODO并添加更多空值检查之外,这应该是一个相当完整的解决方案,尽管您的里程可能会有所不同,尤其是在返回有效的HL7确认消息时。

奖金。为什么不使用业务流程?

在对该问题的评论中提到了这一点,以下是使用自定义管道组件而不是编排的几个原因:

  1. 业务流程很慢。 Microsoft在他们自己的Optimizing Orchestration Performance文章中表示,应尽可能避免使用业务流程。业务流程增加了延迟和响应时间,因为它们需要额外的往返BizTalk MessageBox数据库,并且其他进程和线程将在BizTalk服务器上进行调整。
  2. 致谢返回更快。 HL7集成通常使用accept/receipt acknowledgements。在确认最后发送的消息之前,许多系统不会发送其他消息。因此,如果您必须等待业务流程旋转,请读取输入,构造ACK输出,将ACK返回到端口,然后将ACK发回,您将大大减慢处理速度。是的,这与上面的#1相似,但重要的是要理解。
  3. 业务流程使您的解决方案更容易出错。业务流程是另一个失败点。如果您必须将生成ACK的业务流程或其associated host instance(s)脱机,那么您将失去接收邮件的能力。 BizTalk的一大好处是能够隔离集成解决方案的不同部分,实现高可用性和更高的可靠性。只需将解耦的接收端口的管道组件在将入站消息发布到BizTalk消息框后返回确认,即使内部系统/组件已关闭,也可以继续接收消息。

答案 2 :(得分:0)

这里有很多事情。

1号 - 根据我的经验,HL7的编排只应在极端情况下使用。我们的实现只有少数我们需要从单个入站消息中分出多个消息。仅消息传递方法最适合HL7。它们既昂贵又缓慢,并且回应了最新消息,增加了额外的失败点。

第2号 - 所说的内容和部分都是真实的,至少我是怎么做的。你可以绕过DASM的某些方面,我也这样做,因为它绝对不是完美的。所以我将它包装起来并包含您的自定义功能。 DASM向消息传递引擎返回一个队列,其中包含反汇编的消息和一个确认消息,您可以处理ACK并将您自己的“静态”排入队列。 ACK。

DASM以xml格式创建ACK并对其进行排队,以便发送管道上的ASM可以将其与其他一些东西一起组装回原始HL7格式。因此,您可以在自定义管道组件中执行相同操作,或者找到一种方法来在DASM中调用创建ACK的私有方法,并让它为您完成所有操作。