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需要涵盖的一个非常基本的场景。您只需要:
如前所述,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();
}