BizTalk-从数据库读取两次接收端口

BizTalk-从数据库读取两次接收端口,biztalk,polling,Biztalk,Polling,我的接收端口是sqlBinding和类型化轮询端口。它调用SP获取记录,并根据筛选条件启动相应的业务流程。BizTalk组由2台服务器组成;因此有2个ReceiveHost实例。如果两个主机实例都在运行—在某个点上,同一请求被读取两次—则会在接收方端造成重复。但是,为什么里夫港不止一次读取同一记录?读取记录的进程会更新记录并对其进行更新,以使其不再被复制 我在提交10个请求时观察到了这种情况;接收端口读取11次并启动11个业务流程 我在一台主机上尝试了相同的(10个请求)(就像在我的开发中一样)

我的接收端口是sqlBinding和类型化轮询端口。它调用SP获取记录,并根据筛选条件启动相应的业务流程。BizTalk组由2台服务器组成;因此有2个ReceiveHost实例。如果两个主机实例都在运行—在某个点上,同一请求被读取两次—则会在接收方端造成重复。但是,为什么里夫港不止一次读取同一记录?读取记录的进程会更新记录并对其进行更新,以使其不再被复制

我在提交10个请求时观察到了这种情况;接收端口读取11次并启动11个业务流程


我在一台主机上尝试了相同的(10个请求)(就像在我的开发中一样),接收只显示10个。有什么线索吗?

快速回答是,您有两个选项可以解决此问题:

  • 修复存储过程,使其在并发情况下正确运行
  • 将SQL轮询接收处理程序放置在群集BizTalk主机内
  • 下面是正在发生的事情的解释,在此基础上,我给出了解决此问题的实现细节:

    解释 这是由于BizTalk接收位置在多个主机实例上运行时的工作方式(即,接收位置中指定的适配器的接收处理程序在具有多个主机实例的主机上运行)

    在这种情况下,两个主机实例都将运行其接收处理程序

    这通常不是问题-大多数接收适配器都可以管理这一点,并为您提供预期的行为。例如,文件适配器在读取文件时锁定文件,防止重复读取

    当轮询SQL接收位置命中存储过程时,这是一个问题的主要地方。在这种情况下,BizTalk别无选择,只能信任SQL过程来提供正确的结果

    在没有看到您的过程的情况下很难判断,但是您查询记录的方式并不能保证唯一读取

    也许你有这样的想法:

    Select * From Record 
    Where Status = 'Unread'
    
    Update Record 
    Set Status = 'Read'
    Where Status = 'Unread'
    
    上述过程可能会给出重复的记录,因为在select和update之间,select的另一个调用能够潜入并选择尚未更新的记录

    实施解决方案 修正程序 该过程的一个简单修复方法是首先使用唯一id进行更新:

    Update Record 
    Set UpdateId = @@SPID, Status = 'Reading'
    Where Status = 'Unread'
    
    Select * From Record
    Where UpdateId = @@SPID
    And Status = 'Reading'
    
    Update Record
    Set Status = 'Read'
    Where UpdateId = @@SPID
    And Status = 'Reading'
    
    @@SPID应该是唯一的,但如果证明不是唯一的,则可以使用newid()

    使用群集主机 创建新主机时,可以在BizTalk server管理控制台中指定该主机为群集主机。有关执行此操作的详细信息,请参阅

    基本上,您可以正常创建一个主机,每个服务器上都有主机实例,然后右键单击该主机并选择集群

    然后为在该主机下工作的轮询创建SQL接收处理程序,并在接收位置使用该处理程序


    BizTalk群集主机可确保作为该主机成员的所有项目一次只能在一个主机实例上运行。这将包括您的SQL接收位置,因此在调用您的过程时,您不会有任何竞争条件的机会。

    您好,这正是我面临的问题。但我看不出使用唯一id如何解决这个问题。也许我没有把所有的点都连接起来。是什么阻止第二次调用更新和选择相同的记录?谢谢