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

Biztalk 在反汇编程序管道组件中-仅从GetNext()方法发送最后一条消息,biztalk,message,pipeline,Biztalk,Message,Pipeline,我有一个要求,我将收到一批记录。我必须反汇编数据并将其插入我已完成的数据库中。但是我不希望任何消息从管道中传出,除了最后一条定制消息 我已经扩展了FFDasm并调用了反汇编程序(),然后我们有了GetNext(),它将返回所有被删除的消息,并且由于存在订阅者,它们失败了。在最后一条消息之前,我不想从GetNext()发送任何内容 如果有人已经实施了此要求,请提供帮助。谢谢 建议的方法是在反汇编阶段后将消息发布到BizTalk message box db,并使用db适配器插入数据库。将消息发布到

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

我已经扩展了
FFDasm
并调用了
反汇编程序()
,然后我们有了
GetNext()
,它将返回所有被删除的消息,并且由于存在订阅者,它们失败了。在最后一条消息之前,我不想从
GetNext()
发送任何内容


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

建议的方法是在反汇编阶段后将消息发布到BizTalk message box db,并使用db适配器插入数据库。将消息发布到消息框并使用适配器将为您提供更多关于设计/性能的选项,并将DB insert与接收逻辑解耦。同样在将来,如果您想将相同的消息用于其他内容,您也可以这样做

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

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

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

我正在从GetNext()调用DBInsert SP

哦……所以……很抱歉,但你做得不对,而且实际上在做这件事时制造了一大堆问题(

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

  • 用于提升BTS.InterchageID的管道组件
  • 在BTS.InterchangeID上关联并使用有序交付的顺序车队编排
  • 在编排中,调用SP,转换为SOAP,调用SOAP端点,无论您需要什么
  • 在处理消息时,请检查BTS.LastInterchagneMessage,然后执行收尾逻辑
  • 100%清楚地说,这里没有实际的“性能”问题。通过猜测“性能”,您实际上已经制造了您想解决的问题,并为以后制造了一系列支持问题,再次抱歉。:(没有理由不使用编排


    如前所述,25K记录并不多。请确保接收位置和业务流程位于不同的主机中。

    如果您只想在GetNext上发送一条消息,则必须调用反汇编方法以基本反汇编并获取所有消息(您可以将这些消息排队以在GetNext上管理它们),如下所示:


    抱歉,如果要插入到数据库中,如何不处理批处理消息本身?在问题中显示相关代码将有助于人们回答此问题。嗨,Vikas,到目前为止,我正在从GetNext()调用DBInsert SP,因为我在GetNext()中获得了每个单独的记录。我的卷很大,大约有25K个平面文件记录,需要先存储在DB中。最后一条消息触发orch轮询每个记录并转换为SOAP请求。嗨,Vikas,到目前为止,当我在GetNext()中获取每个记录时,我正在从GetNext()调用DBInsert SP。我的卷很大,大约有25K个平面文件记录,需要先存储在DB中。最后一条消息触发orch轮询每个记录并转换为SOAP请求。在反汇编程序()中调用SP会严重影响性能。这就是为什么我在GetNext()中执行此操作,但在GetNext()中执行此操作的原因我想避免发送一条伪消息。有什么方法可以做到这一点吗?您应该使用另一种方法,25k不是一个很大的容量。您可以让这些消息发布到MessageBox,然后从那里发送到MSMQ。然后您可以对它们执行任何操作。MSMQ可以在您拥有的任何BizTalk server上使用,并且是pWindows的艺术。您可以使用MSMQ适配器从队列发送或接收消息,并处理它们以转到DB以及创建SOAP请求。没有Vikas,这是不会被接受的。这是提供的架构,我必须遵循它。因此无法停止GetNext()要将空消息发布到MsgBox?嗨,约翰,我的要求是,我必须从管道调用SP以避免任何数据丢失。1.将数据加载到DB。2.为每个记录创建soap请求。3.获取soap响应。4.批处理所有响应并将其作为FF发送到外部系统。好的……甚至更糟。抱歉,您正在创建潜在的灾难性消息这意味着,与使用BizTalk的所有可靠性功能相比,在管道中调用SP会造成更大的数据丢失概率。我所描述的使用BizTalk是完全可靠的,坦率地说,比您已经实现的模式可靠得多。您所描述的一切都应该使用BizTalk来完成业务流程和数据库适配器,其中内置了重试、错误处理等功能。否则,您基本上必须自己重新编写所有这些功能。orch方法有一个问题。1.您需要一个orch来调用SP并进行重试和错误处理。2.您还需要一个orch来轮询数据库,创建请求响应。我想消除第一个orc通过在DB中调用SP,不希望被删除的消息发布到msgBox。但这些不是“问题”。它们不是。如果你愿意,你可以在一个编排中完成所有这些。虽然我可能会使用两个,或者三个连续调用。这没有什么错,没有什么。事实上,这就是
     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 
        }
    
    public new IBaseMessage GetNext(IPipelineContext pContext)
    {
       return _messages.Dequeue();
    }