Multithreading cfhttp在cfloop限制中?使用cfthread

Multithreading cfhttp在cfloop限制中?使用cfthread,multithreading,coldfusion,cfhttp,cfloop,cfthread,Multithreading,Coldfusion,Cfhttp,Cfloop,Cfthread,我目前正在尝试开发一个API,我现在所处的阶段是用完整的数据集(ID、名字、姓氏、dob等)填充一个表 我写这篇文章的方法是使用一个从1到500000的cfloop(因为我不知道id的范围是从和到),在每个cfloop中,我调用一个函数,向服务器发出cfhttp请求并检索内容 然后,我反序列化返回的JSON,调用一个函数来查询我的表,查看当前项ID是否已经存在,如果不存在,则调用一个函数来插入记录 然而,cfloop似乎在300请求标记附近停止,所以我想知道是否有更好的方法来完成我正在做的事情?

我目前正在尝试开发一个API,我现在所处的阶段是用完整的数据集(ID、名字、姓氏、dob等)填充一个表

我写这篇文章的方法是使用一个从1到500000的cfloop(因为我不知道id的范围是从和到),在每个cfloop中,我调用一个函数,向服务器发出cfhttp请求并检索内容

然后,我反序列化返回的JSON,调用一个函数来查询我的表,查看当前项ID是否已经存在,如果不存在,则调用一个函数来插入记录

然而,cfloop似乎在300请求标记附近停止,所以我想知道是否有更好的方法来完成我正在做的事情?也许是通过使用我从未使用过的CFTHREAD标记

这方面的代码部分如下:

<cfset Variables.url = "someurl.html" />
<cfloop from=100000 to=500000 index="itemNo">
    <cfset Variables.itemID = itemNo />
    <cfset getItemData = Application.cfcs.Person.getPersonData(Variables.url,Variables.itemID) />
    <cfif StructKeyExists(Variables,"getPersonData.FileContent")>
        <cfset Variables.getPersonData = DeserializeJSON(getPersonData.FileContent)>
        <cfscript>
            // CHECK IF PERSON ALREADY IN DATABASE
            Variables.getPerson = Application.cfcs.Person.getPersonRecord(Variables.itemID);
            // INSERT ITEM IN TO TABLE
            Variables.DOB = CreateDate(Year(Variables.getPersonData.Item.DateOfBirth.Year),Month(Variables.getPersonData.Item.DateOfBirth.Month),Day(Variables.getPersonData.Item.DateOfBirth.Day));
            Variables.insPerson = Application.cfcs.Person.insPerson(Variables.getPersonData.personID,Variables.getPersonData.Item.FirstName,Variables.getPersonData.Item.LastName,Variables.getPersonData.Item.CommonName,Variables.DOB);   
        </cfscript>
    </cfif>
</cfloop>

//检查数据库中是否已经有人
Variables.getPerson=Application.cfcs.Person.getPersonRecord(Variables.itemID);
//在表中插入项
Variables.DOB=CreateDate(年(Variables.getPersonData.Item.DateOfBirth.Year)、月(Variables.getPersonData.Item.DateOfBirth.Month)、日(Variables.getPersonData.Item.DateOfBirth.Day));
Variables.insPerson=Application.cfcs.Person.insPerson(Variables.getPersonData.personID,Variables.getPersonData.Item.FirstName,Variables.getPersonData.Item.LastName,Variables.getPersonData.Item.CommonName,Variables.DOB);

是的,这是可能的。你需要分开通话。创建一个简单的htlm页面,用javascript生成xmlhttprequest。我还没有测试下面的示例,但它应该可以工作

<script>
var itemNo= 1;
function download()
{
 var xhr = new XMLHttpRequest();
 xhr.open("GET", "getdata.cfm?itemNo="+itemNo, true);
 xhr.onload = function (e) {
  if (xhr.readyState === 4) {
   if (xhr.status === 200) 
   {
     itemNo++;
     if(itemNo<=500000) download();
   }
   else 
   {
     itemNo++;
    // Error handling
   }
  }
 };
 xhr.onerror = function (e) {
      itemNo++;
 // Error handling
 };
 xhr.send(null);
}
</script>

var itemNo=1;
函数下载()
{
var xhr=new XMLHttpRequest();
xhr.open(“GET”、“getdata.cfm?itemNo=“+itemNo,true”);
xhr.onload=函数(e){
if(xhr.readyState==4){
如果(xhr.status==200)
{
itemNo++;

如果(itemNo)“cfloop似乎在300请求标记附近停止”-它是否发出错误消息?日志中是否有任何内容?cfcs.Person.getPersonData()来自何处获取它的数据?如果错误:内存不足,您必须进行小批量操作,因为直到请求在CF中结束时,才会释放AFAIK内存。首先,您需要查找API是什么。--您所做的一切似乎都是对可能存在或不存在的数据进行大量调用,并尝试将其加载到数据库中。这并不比屏幕s好废话。放下ColdFusion锤子,考虑一个优雅的解决方案,比如批量加载。我同意@Claude的观点,如果有任何方法可以避免发出50万个HTTP请求,那么就采用这种方法。如果真的没有办法,这里有一些提示:您的进程可能/将崩溃,因此您必须保持状态以保持trac如果你关心这个过程的运行速度,就不要使用CFHTTP,它在高流量下不会运行,而且由于内存问题,它也不会运行。相反,请使用一个支持保持有效性的Java HTTP库:那么包含下载函数的html页是否应该发出请求t到第三方网站?否调用的getdata.cfm页面应包含cfhttp函数。这可确保用于创建http请求的内存在页面处理完成后释放。(顺便说一句,我假设实际的cfhttp请求位于Application.cfcs.Person.getPersonData组件内。另外,建议创建一个简单的容器,如跟踪上次调用document.getElementById(“计数器”)的id.innerHTML=rownr;是的。因此,在getdata.cfm页面中,我在包含脚本的html页面上创建了一个cfinclude模板,在我调用一组脚本标记中的下载函数之后,在我设置itemID之前?否,html页面由您在浏览器中调用。顺序如下。打开html页面。调用dowload函数。下载函数使用名为itemNo的变量向getdata.cfm发出http请求。在getdata.cfm页面上调用组件。在getdata.cfm页面上执行所有代码后,它返回页面内容(html)返回下载函数。然后,下载函数将itemNo变量增加1,并再次调用getdata.cfm页面。此过程将继续,直到达到rownr 500001。对原始答案进行了一些小的更改,以便于理解。
<!--- getdata.cfm --->
<cfset Variables.url = "someurl.html" />
<cfset Variables.itemID = itemNo />
<cfset getItemData = Application.cfcs.Person.getPersonData(Variables.url,Variables.itemID) />
<cfif StructKeyExists(Variables,"getPersonData.FileContent")>
    <cfset Variables.getPersonData = DeserializeJSON(getPersonData.FileContent)>
    <cfscript>
        // CHECK IF PERSON ALREADY IN DATABASE
        Variables.getPerson = Application.cfcs.Person.getPersonRecord(Variables.itemID);
        // INSERT ITEM IN TO TABLE
        Variables.DOB = CreateDate(Year(Variables.getPersonData.Item.DateOfBirth.Year),Month(Variables.getPersonData.Item.DateOfBirth.Month),Day(Variables.getPersonData.Item.DateOfBirth.Day));
        Variables.insPerson = Application.cfcs.Person.insPerson(Variables.getPersonData.personID,Variables.getPersonData.Item.FirstName,Variables.getPersonData.Item.LastName,Variables.getPersonData.Item.CommonName,Variables.DOB);   
    </cfscript>
</cfif>