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

时间:2018-09-10 17:06:59

标签: biztalk message pipeline

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

我已经扩展了FFDasm并称为Disassembler(),然后我们有了GetNext(),它会退回所有已分拆的消息,由于有订阅者,它们失败了。我想从GetNext()到最后一封邮件都什么也不发。

如果有人已经实施了此要求,请提供帮助。谢谢!

3 个答案:

答案 0 :(得分:0)

推荐的方法是在反汇编阶段之后将消息发布到BizTalk消息框db,并使用db适配器插入数据库。将消息发布到消息框并使用适配器将为您提供更多的设计/性能选择,并使数据库插入与接收逻辑脱钩。同样在将来,如果您想将同一条消息重用于其他用途,则可以这样做。

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

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

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

答案 1 :(得分:0)

  

我正在从GetNext()调用DBInsert SP

哦...太抱歉了,但是您做错了,实际上这样做会产生很多问题。 :(

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

  1. 用于推广BTS.InterchageID的管道组件
  2. 与BTS.InterchangeID相关并使用有序交付的顺序车队编排。
  3. 在业务流程中,根据需要调用SP,转换为SOAP,再调用SOAP端点。
  4. 在处理消息时,请检查BTS.LastInterchagneMessage,然后执行封闭逻辑。

要100%明确,这里没有实际的“性能”问题。通过猜测“性能”,您实际上已经创建了您要解决的问题,并创建了许多支持问题,以后再说,对不起。 :(没有理由不使用业务流程。

如前所述,25K条记录并不多。确保在不同的主机中具有“接收位置”和“业务流程”。

答案 2 :(得分:0)

如果只想在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();
}