我有一个要求,我将在其中接收一批记录。我必须反汇编并将数据插入已完成的DB中。但是我不希望除了最后一条定制消息以外的任何消息从管道中传出。
我已经扩展了FFDasm
并称为Disassembler()
,然后我们有了GetNext()
,它会退回所有已分拆的消息,由于有订阅者,它们失败了。我想从GetNext()
到最后一封邮件都什么也不发。
如果有人已经实施了此要求,请提供帮助。谢谢!
答案 0 :(得分:0)
推荐的方法是在反汇编阶段之后将消息发布到BizTalk消息框db,并使用db适配器插入数据库。将消息发布到消息框并使用适配器将为您提供更多的设计/性能选择,并使数据库插入与接收逻辑脱钩。同样在将来,如果您想将同一条消息重用于其他用途,则可以这样做。
即使出于任何原因,如果您必须从管道组件中插入,也请执行以下操作:
请注意,在Disassemble()方法完成之前,不会调用IDisassembler接口的GetNext()方法。基于此,假设您已将FFDASM封装在自己的自定义组件中,则可以使用以下方法:
将所有反汇编的消息插入反汇编方法本身,并仅将最后一条消息排队到Queue类变量中。在GetNext()消息中,然后返回出队消息,当Queue为空时,返回null。您可以通过一次插入多行并根据容量批量保存来优化数据库插入。请注意,这种方法可能会遇到性能问题,具体取决于文件的大小和插入db的行数。
答案 1 :(得分:0)
我正在从GetNext()调用DBInsert SP
哦...太抱歉了,但是您做错了,实际上这样做会产生很多问题。 :(
这是BizTalk Server涵盖的非常基本的方案。您只需要:
要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();
}