我有一个要求,我将收到一批记录。我必须将我完成的数据反汇编并插入到数据库中。但我不希望管道中发出任何消息,除了最后一条自定义消息。
我已经扩展了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 涵盖的非常基本的方案。 您所需要的只是:
- 用于提升 BTS 的管道组件。间歇ID
- 与防弹少年团相关的顺序车队编排。交换 ID 并使用订购交货。
- 在业务流程中,调用 SP,转换为 SOAP,调用 SOAP 终结点,无论您需要什么。
- 处理消息时,请检查 BTS。LastInterchagneMessage,然后执行您的关闭逻辑。
为了100%清楚,这里没有实际的"性能"问题。 通过猜测"性能",您实际上已经创建了您正在考虑解决的问题,并为以后创建了一堆支持问题,再次抱歉。 :( 没有理由不使用业务流程。
如前所述,25K 记录并不多。 请确保在不同的主机中具有接收位置和业务流程。