2013-06-24 2 views
0

В настоящее время я пытаюсь разработать API и этап, на котором я сейчас нахожусь, заполнить таблицу полным набором данных (ID, имя, фамилия, доба и т. д.).cfhttp в cfloop limit? use cfthread

Способ, которым я написал это, использовать cfloop от 1 до 500 000 (поскольку я не знаю, от какого диапазона варьируются ID и до), и внутри каждого cfloop я вызываю функцию, которая делает запрос cfhttp сервер и получить содержимое.

Затем я десериализую возвращенный JSON, вызываю функцию для запроса моей таблицы, чтобы узнать, существует ли текущий идентификатор элемента, а если нет, вызовите функцию для вставки записи.

Однако 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> 
+2

«Похоже, что cfloop останавливается вокруг отметки« 300 »- это сообщение об ошибке? Что-нибудь в журналах? – imthepitts

+0

Откуда cfcs.Person.getPersonData() получить его данные? –

+0

Если ошибка: из памяти вы должны делать это небольшими партиями, потому что воспоминания AFAIK не освобождаются до тех пор, пока запрос не закончится в CF. – Henry

ответ

1

Да, это возможно. Вам нужно разделить вызов. Создайте простую страницу htlm, которая создает xmlhttprequest в javascript. Я не тестировал приведенный ниже пример, но он должен работать.

<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> 

На запрошенной странице сделайте вызов объекту, который делает запрос cfhttp.

<!--- 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> 

На запрошенной странице вы можете использовать cfhtread для одновременного запроса нескольких HTTP-запросов. Вы можете посмотреть здесь для получения дополнительной информации об использовании cfthread вместе с cfhttp http://www.bennadel.com/blog/749-Learning-ColdFusion-8-CFThread-Part-II-Parallel-Threads.htm

+0

Так должна ли страница html, содержащая функцию загрузки, делать запрос на сторонний сайт? – CPB07

+0

Нет вызываемой страницы getdata.cfm, которая должна содержать функцию cfhttp. Это гарантирует, что память, используемая для создания HTTP-запроса, будет выпущена после обработки страницы.(Кстати я предположил, что фактический запрос cfhttp находится внутри компонента Application.cfcs.Person.getPersonData. На стороне, обратите внимание, что это advicable создать простой контейнер как , который отслеживает который последний раз называется document.getElementById («counter»). innerHTML = rownr; – Nebu

+0

Да, это правильно. Поэтому на странице getdata.cfm я создаю шаблон cfinclude на странице html, содержащий скрипт, и сразу после вызова функция загрузки в наборе тегов скриптов, прежде чем я установил itemID? – CPB07