查询循环会创建多个线程吗?

后端开发 2026-07-11

这是在ColdFusion 11中。

我有一个相当简单的循环,作为CF调度任务的一部分,拿取一些数据,创建并初始化一个对象,然后调用该对象实例上的一个方法,通过CFHTTP将数据发布到API:

LOCAL.qOrders=getReportData();

for (LOCAL.Order in LOCAL.qOrders) {
    LOCAL.UploadOrder=new UploadOrder();

    LOCAL.UploadOrder
        .setKey(LOCAL.Order.id);

    LOCAL.UploadOrder
        .saveApiOrder();
}

这个过程在99% 的时间里都能正常工作。然而,偶尔我发现它会多次向API发布数据,导致端点数据重复。

于是,我添加了一些日志记录,并进行一个睡眠(CFHTTP调用的超时设为5 秒,总睡眠为6 秒),以看看是否能防止这种情况发生,并在再次发生时有可用的信息:

LOCAL.qOrders=getReportData();

for (LOCAL.Order in LOCAL.qOrders) {
    LOCAL.UploadOrder=createUploadOrder();
    LOCAL.UploadOrder
        .setKey(LOCAL.Order.id);

    writeLog(
        file="XML-Orders-Post",
        type="Information",
        text=   "Posting Order; Date/Time: "
            &   DateTimeFormat(Now(), "yyyy-mm-dd HH:nn:ss.l")
            &   "; Order Number: "
            &   LOCAL.UploadOrder.getorder_reference_1()
        );

    LOCAL.OrderMessages=
        LOCAL.UploadOrder
            .saveApiOrder();

    if (IsDate(LOCAL.UploadOrder.getresponse_received_datetime())) {
        LOCAL.PostResponse="Posted Successfully";
    }
    else if (ArrayLen(LOCAL.OrderMessages)) {
        LOCAL.PostResponse=LOCAL.OrderMessages[1].gettext();
    }
    else {
        LOCAL.PostResponse="Unknown Error";
    }

    writeLog(
        file="XML-Orders-Post",
        type="Information",
        text=   "Order Posted; Date/Time: "
            &   DateTimeFormat(Now(), "yyyy-mm-dd HH:nn:ss.l")
            &   "; Order Number: "
            &   LOCAL.UploadOrder.getorder_reference_1()
            &   "; Response: "
            &   LOCAL.PostResponse
        );

    thread action="sleep" duration=6000;
}

这段新代码第一次运行时没有问题——没有重复,日志也没有显示出多次API调用。

但在第五次尝试时,端点出现了一些重复。日志显示这似乎发生在同一个任务运行中、但在多线程中。下面是新日志的一个示例,显示先是一条成功的提交,随后一个新线程弹出,紧随第一条提交仅几毫秒之差发生:

"Severity","ThreadID","Date","Time","Application","Message"
"Information","ajp-bio-8014-exec-1","03/20/26","09:12:16","MYAPP-SCHEDULED-TASKS","Posting Order; Date/Time: 2026-03-20 09:12:16.852; Order Number: VE2127771"
"Information","ajp-bio-8014-exec-1","03/20/26","09:12:19","MYAPP-SCHEDULED-TASKS","Order Posted; Date/Time: 2026-03-20 09:12:19.433; Order Number: VE2127771; Response: Posted Successfully"
"Information","ajp-bio-8014-exec-1","03/20/26","09:12:25","MYAPP-SCHEDULED-TASKS","Posting Order; Date/Time: 2026-03-20 09:12:25.456; Order Number: VE2127772"
"Information","ajp-bio-8014-exec-1","03/20/26","09:12:37","MYAPP-SCHEDULED-TASKS","Posting Order; Date/Time: 2026-03-20 09:12:37.324; Order Number: VE2127772"
"Information","ajp-bio-8014-exec-2","03/20/26","09:12:38","MYAPP-SCHEDULED-TASKS","Posting Order; Date/Time: 2026-03-20 09:12:38.153; Order Number: VE2127772"
"Information","ajp-bio-8014-exec-1","03/20/26","09:12:38","MYAPP-SCHEDULED-TASKS","Order Posted; Date/Time: 2026-03-20 09:12:38.700; Order Number: VE2127772; Response: Posted Successfully"
"Information","ajp-bio-8014-exec-2","03/20/26","09:12:39","MYAPP-SCHEDULED-TASKS","Order Posted; Date/Time: 2026-03-20 09:12:39.498; Order Number: VE2127772; Response: Posted Successfully"
"Information","ajp-bio-8014-exec-1","03/20/26","09:12:44","MYAPP-SCHEDULED-TASKS","Posting Order; Date/Time: 2026-03-20 09:12:44.724; Order Number: VE2127773"
"Information","ajp-bio-8014-exec-2","03/20/26","09:12:45","MYAPP-SCHEDULED-TASKS","Posting Order; Date/Time: 2026-03-20 09:12:45.521; Order Number: VE2127773"

FWIW,查询结果循环最多有20行,任务运行的脚本的请求超时为240秒,以便每行处理大约需要11秒(5秒 CFHTTP超时,外加6 秒睡眠)。

我需要阻止这种情况再次发生。有人能否给出原因以及如何防止?

解决方案

我不能百分之百确认,但我认为此问题的原因在于调度任务上的“重试次数”设置。它被设为“3”,我猜这是默认值(也不知道为什么不是零)。在处理HTTP响应时,这段脚本在某些情况下会抛出一个“错误”。这个“错误”在代码中被处理(记录日志、发送邮件通知等),但我认为这可能根据“重试次数”设置触发任务重新执行,而用于检索未处理订单的查询包含了原始线程中已在处理中进度中的订单,因此它们彼此之间只有1 秒左右的时间就被发送。我把“重试次数”设为零。希望这能解决问题。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章