multithreading - cfhttp cfloop सीमा में? cfthread का उपयोग करें



coldfusion (1)

हाँ यह संभव है। आपको कॉल को अलग करना होगा एक सरल एचटीएलएम पेज बनाएं जो जावास्क्रिप्ट में एक एक्सएमएलhttprequest बनाता है। मैंने नीचे दिए गए उदाहरण का परीक्षण नहीं किया है लेकिन यह काम करना चाहिए

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

अनुरोधित पृष्ठ पर आप एकाधिक HTTP अनुरोध को एक साथ करने के लिए cfhtread का उपयोग कर सकते हैं। आप सीएफएचटीपी http://www.bennadel.com/blog/749-Learning-ColdFusion-8-CFThread-Part-II-Parallel-Threads.htm के साथ cfthread का उपयोग करने के बारे में अधिक जानकारी के लिए यहां देख सकते हैं

मैं वर्तमान में एक एपीआई और चरण विकसित करने की कोशिश कर रहा हूं जहां मैं अभी एक पूर्ण डेटा सेट (आईडी, प्रथम नाम, अंतिम नाम, डॉब आदि) के साथ एक टेबल को भरना चाहता हूं।

मैंने जिस तरह से लिखा है, वह 1 से 500,000 तक सीफ़्लूप का उपयोग करना है (जैसा कि मुझे पता नहीं है कि आई डी एस की सीमा से लेकर लेकर कितनी सीमा होती है) और प्रत्येक सीफ़्लूप के भीतर मैं एक फ़ंक्शन कॉल करता हूं जो सर्वर से सीएफएचपीपी अनुरोध करता है और पुनः प्राप्त करता है सामग्री।

मैं फिर लौटे हुए 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>