在反汇编程序管道组件中 - 仅从 GetNext() 方法发送最后一条消息

In Disassembler pipeline component - Send only last message out from GetNext() method

我有一个要求,我将接收一批记录。我必须将数据反汇编并插入到我已经完成的数据库中。但除了最后一条定制消息外,我不希望任何消息从管道中传出。

我已经扩展了 FFDasm 并调用了 Disassembler(),然后我们有 GetNext(),它返回每条分批处理的消息,但由于有订阅者,它们失败了。从 GetNext() 到最后一条消息,我不想发送任何内容。

如果有人已经实现了这个要求,请帮忙。谢谢!

推荐的方法是在反汇编阶段后将消息发布到 BizTalk 消息框数据库,并使用数据库适配器插入数据库。将消息发布到消息框并使用适配器将为您提供更多 design/performance 选项,并将您的数据库插入与接收逻辑分离。此外,如果您将来想将同一消息重复用于其他用途,您也可以这样做。

即使出于任何原因,如果您必须从管道组件插入,请执行以下操作:

请注意,IDisassembler 接口的 GetNext() 方法只有在 Disassemble() 方法完成后才会被调用。基于此,假设您已将 FFDASM 封装在您自己的自定义组件中,您可以使用以下方法:

在反汇编方法本身中插入所有反汇编的消息,并仅将最后一条消息排队到 Queue class 变量中。在 GetNext() 消息中然后 return Dequeued 消息,当 Queue 为空时 return null。您可以通过一次插入多行并根据数量分批保存它们来优化数据库插入。请注意,此方法可能会遇到性能问题,具体取决于文件大小和插入数据库的行数。

I am calling DBInsert SP from GetNext()

哦...所以...很抱歉,但是您做错了,实际上这样做会造成很多问题。 :(

这是 BizTalk Server 涵盖的一个非常基本的方案。您只需要:

  1. 要推广的管道组件BTS.InterchageID
  2. 与 BTS.InterchangeID 相关并使用有序交付的顺序 Convoy 编排。
  3. 在 Orchestration 中,调用 SP,转换为 SOAP,调用 SOAP 端点,任何你需要的。
  4. 在处理消息时,检查 BTS.LastInterchagneMessage,然后执行关闭逻辑。

为了 100% 清楚,这里没有实际的 'performance' 问题。通过猜测 'performance',您实际上已经创建了您想要解决的问题,并为以后创建了一堆支持问题,再次抱歉。 :( 没有理由不使用编排。

如前所述,25K 条记录并不多。请确保在不同的主机中具有接收位置和编排。

如果你只想在 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 方法上,你有队列,你可以return任何你想要的:

public new IBaseMessage GetNext(IPipelineContext pContext)
{
   return _messages.Dequeue();
}