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



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

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

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

如果你只想在 GetNext 上发送一条消息,你必须调用 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();
}

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

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

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

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

我正在从GetNext((调用DBInsert SP

哦。。。所以。。。很抱歉,但你做错了,实际上这样做会产生一堆问题。:(

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

  1. 用于提升 BTS 的管道组件。间歇ID
  2. 与防弹少年团相关的顺序车队编排。交换 ID 并使用订购交货。
  3. 在业务流程中,调用 SP,转换为 SOAP,调用 SOAP 终结点,无论您需要什么。
  4. 处理消息时,请检查 BTS。LastInterchagneMessage,然后执行您的关闭逻辑。

为了100%清楚,这里没有实际的"性能"问题。 通过猜测"性能",您实际上已经创建了您正在考虑解决的问题,并为以后创建了一堆支持问题,再次抱歉。 :( 没有理由不使用业务流程。

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

最新更新