BizTalk 2010 - Создание подтверждений

Информация:

Входящее сообщение имеет тип HL7. Я использую в конвейере приема "Flafile-Disassembler", а не компонент конвейера "BTAHL7 2.x Disassembler", потому что HL7-схема немного изменена, а дизассемблер BTAHl7 разделяет сообщение (составные сообщения), и мы не хочу; И мы не хотим использовать оркестровку.

Вопросы:

Как я могу создавать подтверждения в приемном конвейере в BizTalk 2010, не используя "BTAHL7 Disassembler" (без разделения -> подход из нескольких сообщений)?

Или можно предотвратить разбиение сообщения в компоненте конвейера дизассемблера BTAHL7?

положительный ACK будет достаточно.

Благодарю.

3 ответа

Решение

Как говорит @boatseller, вы не можете запретить дизассемблеру HL7 создавать сообщения, состоящие из нескольких частей.

Другой вопрос: вы можете создать пользовательский конвейерный компонент для отправки подтверждения HL7, а затем просто использовать собственную схему плоских файлов (с готовым компонентом конвейерного компонента дизассемблера плоских файлов).

1. Используйте двусторонний порт приема.

Это должно работать с использованием двустороннего порта, даже с адаптером MLLP, но вам нужно все проверить и протестировать и понять, что Microsoft может поддерживать или не поддерживать использование адаптера MLLP без конвейера дизассемблера HL7 2.X или использование BizTalk в способ, предложенный ниже.

2. Соотнесите запрос и ответ.

Вам потребуется пользовательский компонент конвейера в конвейере получающего местоположения, чтобы BizTalk создал подписку для ответа. Используйте Мастер компонентов конвейера, чтобы быстро приступить к созданию компонента.

В методе Execute вашего пользовательского класса компонента конвейера (который вы получаете от реализации интерфейса IComponent) напишите что-то похожее на приведенный ниже код.

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;
}

Использование или EpmRRCorrelationToken а также RouteDirectToTP свойства для обработки сообщения запрос-ответ без оркестровки описаны в этом сообщении блога MSDN.

3. Создайте и отправьте подтверждение

Вы можете использовать другой пользовательский компонент конвейера внутри вашего конвейера отправки, чтобы вручную создать подтверждение на основе входного сообщения, возможно, с некоторой дополнительной конфигурацией компонента конвейера, которая читается во время выполнения.

Как и первый пользовательский конвейерный компонент, вы можете реализовать метод Execute интерфейса IComponent. Код, подобный этому, должен работать:

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 в своей статье " Оптимизация производительности оркестровки" говорит, что по возможности следует избегать использования оркестровки. Оркестровки увеличивают время ожидания и время отклика, потому что они требуют дополнительных обращений к базе данных BizTalk MessageBox, а дополнительные процессы и потоки запускаются на сервере BizTalk.
  2. Благодарности возвращаются быстрее. Интеграции HL7 обычно используют подтверждения приема / получения. Многие системы не будут отправлять дополнительные сообщения, пока последнее отправленное сообщение не будет подтверждено. Поэтому, если вам нужно дождаться ускорения оркестровки, прочитать вход, построить выход ACK, вернуть ACK в порт и затем отправить ACK обратно, вы значительно замедлите обработку. Да, это похоже на № 1 выше, но это важно понимать.
  3. Оркестровка делает ваше решение более подверженным сбоям. Оркестровка - это еще одна точка отказа. Если вам нужно отключить создаваемую ACK-оркестровку или связанные с ней экземпляры хоста, то вы утратили способность получать сообщения. Большим преимуществом BizTalk является его способность изолировать различные части интеграционного решения, обеспечивая высокую доступность и повышенную надежность. Когда ваши разветвленные компоненты конвейера принимающего порта возвращают подтверждение после простой публикации входящего сообщения в окне сообщений BizTalk, получение сообщений может продолжаться, даже если ваши внутренние системы / компоненты не работают.

Чтобы ответить на ваши конкретные вопросы:

Ack HL7 является специфической функцией дизассемблера HL7. Вам нужно будет создать свой собственный собственный компонент дизассемблера, который будет запускать ffdasm внутри, и сгенерировать свой собственный ack для имитации поведения дизассемблера HL7.

Нет, я не знаю, как запретить дизассемблеру HL7 создавать сообщения из нескольких частей. Вы можете легко рекомбинировать сегменты на карте, выполненной в оркестровке.

Пара вещей здесь.

Номер 1 - По моему опыту, оркестровки для HL7 должны использоваться только в крайних случаях. В нашей реализации есть только несколько, где нам нужно раскрутить несколько сообщений из одного входящего сообщения. Подход только для обмена сообщениями лучше всего подходит для HL7. Они дорогостоящие и медленные, и, повторяя сказанное, добавьте дополнительную точку отказа.

Номер 2 - Кусочки того, что было сказано, должно быть правдой, по крайней мере, как я это делаю. Вы можете обойти некоторые аспекты DASM, и я это сделаю, потому что он определенно не идеален. Так что я бы обернул его и включил ваш пользовательский функционал. DASM возвращает очередь в модуль обмена сообщениями, который содержит дизассемблированное сообщение и подтверждение, вы можете удалить ACK и поставить свой собственный "статический" подтверждение.

DASM создает и ставит в очередь ACK в формате xml, чтобы ASM в конвейере отправки мог собрать его обратно в необработанный формат HL7 вместе с некоторыми другими компонентами. Таким образом, вы можете сделать то же самое в пользовательском конвейерном компоненте или найти способ вызвать те частные методы в DASM, которые создают ACK и позволяют ему делать все это за вас.

Другие вопросы по тегам