【问题标题】:Biztalk Dehydrating and Hydrating LoopBiztalk 脱水和保湿循环
【发布时间】:2016-02-01 20:40:29
【问题描述】:

我有一个简单的 Biztalk 应用程序 2013-r2,它将文件导入表中,然后执行长时间运行的导入后过程(通过存储过程)。

症状:导入 2 个文件时

  • 第一个文件的导入没有问题
  • 然后,后处理开始(由于长时间运行的存储过程,如预期的那样缓慢)
  • 然后,如果您删除第二个文件,则第一个文件后处理将消失,并进行第二次导入。
  • 然后它们开始来回交替(您可以看到后处理字段按预期填充)
  • 两个发送端口都处于活动状态,有时您会看到第三个端口脱水

由于没有报告错误,这一定是一个设置,还是我需要将后期处理移出长期运行的事务?

详情:

  • 编排事务类型长期运行
  • 后处理发送端口的超时时间为 59 分钟
  • 后处理存储过程调用子存储过程。
  • 任何地方都没有报告错误
  • 两个发送端口都已订购交货检查

后处理存储过程:

    CREATE PROCEDURE [sync].[MPostProcessing]
        @Code NVARCHAR(2)
    AS 

    ----
    ---- 2. Normalize Address
    ----
    IF @Code = '99'
        EXEC sync.AElBatch @Code = @Code


CREATE PROCEDURE [sync].[AElBatch ] @Code AS VARCHAR(2)
AS 
    DECLARE @ID AS INT

    WHILE EXISTS ( SELECT   ID
                   FROM     sync.[mtable]
                   WHERE    Code = @Code
                            AND PostProcessingDone = 0 ) 
        BEGIN

            SELECT TOP 1
                    @ID = ID
            FROM    sync.[mtable]
            WHERE   Code = @Code
                    AND PostProcessingDone = 0



            EXEC sync.PParse @ID = @ID


            UPDATE  sync.[mtable]
            SET     PostProcessingDone = 1
            WHERE   Code = @Code
                    AND ID = @ID

        END

然后 PParse 存储过程会执行更多操作(所有工作正常,未报告错误)

Biztalk 服务器管理控制台的图像

【问题讨论】:

  • 我不太清楚你的问题是什么。你说没有错误,所有处理都成功了——你只是想知道为什么会有水合/脱水循环?
  • 然后,如果您删除第二个文件,则第一个文件后处理消失,并进行第二次导入。然后它们开始来回交替(您可以看到后处理字段按预期填充)
  • 第一个文件加载没有完成吗?
  • 只有文件加载部分完成,后处理进行到一半,删除所有行导入第二个文件。
  • 发送端口:导入和后处理都在 Biztalk 服务器管理控制台中处于活动状态

标签: biztalk biztalk-2013r2


【解决方案1】:

所以这对于评论来说太长了,但我仍然不能 100% 确定您的问题。无论哪种方式:

看来您的 SP 可能存在一些问题。重构它们以使用基于集合的查询而不是 while 循环(或游标,如果有的话)。强制 SQL Server 将每个单独的标量变量作为单独的调用处理将阻止它完全优化它在sync.PParse 中所做的任何事情 - 如果需要,将表变量传递给它或其他东西,以便它可以正确并行化它并停止持有东西太糟糕了。

sync.PParse 很可能有一个错误,它正在读取它不应该读取的数据。尤其是来自AElBatch 的这些行令人不安:

        SELECT TOP 1
                @ID = ID
        FROM    sync.[mtable]
        WHERE   Code = @Code
                AND PostProcessingDone = 0

您可能希望在其中添加某种批处理标识符,以便 PostProcessing#2 不会开始获取 PostProcessing#1 的真正含义。

仔细检查sp_who2 的情况,看看事情是否被阻止。即使没有正确显示错误,也可能发生了某些事情。

最后,如果这些都不起作用,您可能必须将它们变成 BizTalk 调用的单个 SP,以便 Ordered Delivery 将两个作业保留在同一个队列中 - 而不是让文件加载 #2 在之前完成后处理作业 #1 已完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多