3

如何使用 CFHTTP 标签执行异步 HTTP 请求?

我正在循环查询结果并通过 HTTP 帖子将一些数据发送到 URL。查询中有很多记录,因此 cfhttp 需要很多时间。

是否可以在 ColdFusion 中发送异步 HTTP 请求?有人建议我可以创建一个线程并在其中调用 cfhttp。除了cfthread还有其他方法吗?

4

1 回答 1

1

正如@peter-boughton 建议的那样,使用线程。

在 CF 9.0.1 中有一个线程内的 http 错误。

所以,这是我做的一个快速原型:

// cf_sucks_workaround.cfc
component extends="com.adobe.coldfusion.base" {
  public function cacheScriptObjects() {

    local.tags = ["CFFTP", "CFHTTP", "CFMAIL", "CFPDF", "CFQUERY",
      "CFPOP", "CFIMAP", "CFFEED", "CFLDAP"];

    for(local.tag in local.tags) {
      getSupportedTagAttributes(local.tag);
    }
  }
}
// async_http.cfm
<cfscript>
lg('start');
main();
lg('done');

void function main() {
    CreateObject('component', 'cf_sucks_workaround').cacheScriptObjects();
    startThreads();
}

void function lg(required string txt) {
    WriteLog(file = 'threads', text = "t#threadNum()# #arguments.txt#");
}

void function sendRequest() {
    var httpService = new http(timeout = "3", url = "https://www.google.com");
    lg('send http req.');
    var httpResult = httpService.send().getPrefix();
    lg(httpResult.StatusCode);
}

void function startThreads() {
    for (local.i = 1; i LTE 3; i++) {
        thread action="run" name="thread_#i#" appname="derp" i="#i#" {
            lg("start");
            sendRequest();
            lg("end");
        }
    }
}

numeric function threadNum() {
    return (IsDefined('attributes') AND StructKeyExists(attributes, 'i')) ? attributes.i : 0;
}

</cfscript>

产生日志输出:

t0 start
t0 done
t1 start
t2 start
t3 start
t3 send http req.
t1 send http req.
t2 send http req.
t3 200 OK
t3 end
t1 200 OK
t1 end
t2 200 OK
t2 end
于 2013-06-03T18:45:19.873 回答