Biztalk脱水和保湿循环

时间:2016-02-01 20:40:29

标签: biztalk biztalk-2013r2

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

症状:导入2个文件时

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

由于没有报告错误,这必须是一个设置,还是我需要将后处理移出长时间运行的交易?

详细说明:

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

enter image description here

后期处理存储程序:

    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服务器管理控制台的图像

enter image description here

1 个答案:

答案 0 :(得分: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之前完成。