multithreading coldfusion cfhttp cfloop cfthread

multithreading - cfhttp en el límite cfloop? usa cfthread



coldfusion (1)

Actualmente estoy intentando desarrollar una API y la etapa en la que estoy ahora es completar una tabla con un conjunto completo de datos (ID, nombre, apellido, dob, etc.).

La forma en que he escrito esto es usar un cfloop de 1 a 500,000 (ya que no sé a qué rango van los IDs desde y hacia) y dentro de cada cfloop llamo una función que realiza una solicitud cfhttp al servidor y recupera el contenido.

Luego deserializo el JSON devuelto, llamo a una función para consultar mi tabla para ver si ya existe el ID del elemento actual y, de lo contrario, invoco una función para insertar el registro.

Sin embargo, el cfloop parece detenerse alrededor de la marca 300, por lo que me preguntaba si había una mejor manera de hacer lo que hago. Tal vez usando la etiqueta CFTHREAD que nunca he tenido la experiencia de usar.

La sección de código para esto es la siguiente:

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


Sí, es posible. Necesitas dividir la llamada. Cree una página htlm simple que haga una xmlhttprequest en javascript. No he probado el ejemplo a continuación, pero debería funcionar.

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

En la página solicitada, realice la llamada al objeto que realiza la solicitud 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>

En la página solicitada, puede usar cfhtread para realizar varias solicitudes de HTTP simultáneamente. Puede buscar aquí más información sobre el uso de cfthread junto con cfhttp http://www.bennadel.com/blog/749-Learning-ColdFusion-8-CFThread-Part-II-Parallel-Threads.htm