В компоненте конвейера дизассемблера - отправлять только последнее сообщение из метода GetNext () - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть требование, когда я буду получать пакет записей. Я должен разобрать и вставить данные в БД, которые я завершил. Но я не хочу, чтобы какое-либо сообщение выходило из конвейера, кроме последнего заказного сообщения.

Я расширил FFDasm и вызвал Disassembler(), затем у нас есть GetNext(), который возвращает каждое отправленное сообщение, и они терпят неудачу, поскольку есть подписчики. Я ничего не хочу отправлять с GetNext() до последнего сообщения.

Пожалуйста, помогите, если кто-нибудь уже выполнил это требование. Спасибо!

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Я вызываю DBInsert SP из GetNext ()

Ох ... так ... извините, но вы делаете это неправильно и фактически создаете кучу проблем, делая это. (

Это очень простой сценарий для BizTalk Server. Все что вам нужно это:

  1. Компонент конвейера для продвижения BTS.InterchageID
  2. Последовательная оркестровка конвоя, коррелирующая с BTS.InterchangeID и использующая заказанную доставку.
  3. В Orchestration вызовите SP, преобразуйте в SOAP, вызовите конечную точку SOAP, что вам нужно.
  4. Во время обработки Сообщений проверьте BTS.LastInterchagneMessage, а затем выполните логику закрытия.

Чтобы быть на 100% ясным, здесь нет практических проблем с производительностью . Догадываясь о «производительности», вы на самом деле создали проблему, которую хотели решить, и создали кучу проблем поддержки на потом, извините еще раз. :( Нет причин не использовать оркестровку.

Как уже отмечалось, 25K записей не много. Обязательно укажите место получения и оркестровку в разных хостах.

0 голосов
/ 11 сентября 2018

Если вы хотите отправить только одно сообщение в GetNext, вам нужно вызвать метод Disassemble на базу Disassemble и получить все сообщения (вы можете поставить эти сообщения в очередь для управления ими в GetNext) как:

 public new void Disassemble(IPipelineContext pContext, IBaseMessage pInMsg)
 {
    try
    {    
       base.Disassemble(pContext, pInMsg);

       IBaseMessage message = base.GetNext(pContext);
       while (message != null)
       {    
           // Only store one message                   
           if (this.messagesCount == 0)
           {
              // _message is a Queue<IBaseMessage>
              this._messages.Enqueue(message);

              this.messagesCount++;
           }

           message = base.GetNext(pContext);
       }              
    }
    catch (Exception ex)
    {
       // Manage errors 
    }

Затем в методе GetNext у вас есть очередь, и вы можете вернуть все, что захотите:

public new IBaseMessage GetNext(IPipelineContext pContext)
{
   return _messages.Dequeue();
}
0 голосов
/ 11 сентября 2018

Рекомендуемый подход - публиковать сообщения после этапа дизассемблирования в окне сообщений BizTalk db и использовать адаптер db для вставки в базу данных. Публикация сообщений в окне сообщений и использование адаптера предоставит вам больше возможностей по дизайну / производительности и отделит вставку вашей БД от логики приема. Также в будущем, если вы захотите повторно использовать то же сообщение для чего-то другого, вы сможете это сделать.

Даже по любой причине, если вам нужно вставить компонент конвейера, сделайте следующее:

Обратите внимание, что метод GetNext () интерфейса IDisassembler не вызывается до тех пор, пока метод Disassemble () не будет завершен. Исходя из этого, вы можете использовать следующий подход, предполагая, что вы инкапсулировали FFDASM в свой собственный компонент:

Вставить все дизассемблированные сообщения в сам метод дизассемблирования и поставить в очередь только последнее сообщение в переменную класса Queue. Затем в сообщении GetNext () верните сообщение Dequeued, когда очередь пуста и верните null. Вы можете оптимизировать вставку в БД, вставляя одновременно несколько строк и сохраняя их в пакетах в зависимости от объема. Обратите внимание, что при таком подходе могут возникнуть проблемы с производительностью в зависимости от размера файла и количества строк, вставляемых в БД.

...