3

バックグラウンド:

これは、外部サイトからデータを取得し(外部サイトは、Webサービスを介してデータを取得するためのAPIを提供します)、データベースを新しい情報で更新するスケジュールされたジョブの一部です。約3,500のデータ項目を取得しています。現在スケジュールされているジョブはCFThread、一度に10スレッドを実行するタスクのブロックを作成し、それらを結合してから次の10ブロックを開始します。

コード:

<cfset local.nMaxThreadCount = 10>
<!---retrieve a query that contains the items that need to be updated, approximately 3,500 items--->
<cfset local.qryItemsNeedingUpdate = getItemsNeedingUpdate(dtMostRecentItemPriceDate = local.qryMostRecentItemPriceDate.dtMostRecentItemPrice[1])>
<cfset local.nThreadBlocks = Ceiling(local.qryItemsNeedingUpdate.RecordCount / local.nMaxThreadCount)>

<cftry>
<cfloop index="local.nThreadBlock" from="1" to="#local.nThreadBlocks#">
    <cfif local.nThreadBlock EQ local.nThreadBlocks>
        <cfset local.nThreadCount = local.qryItemsNeedingUpdate.RecordCount MOD local.nMaxThreadCount>
    <cfelse>
        <cfset local.nThreadCount = local.nMaxThreadCount>
    </cfif>
    <cfset local.lstThreads = "">
    <cfloop index="local.nThread" from="1" to="#local.nThreadCount#">
        <cfset local.nQryIdx = ((local.nThreadBlock - 1) * local.nMaxThreadCount) + local.nThread>
        <cfset local.vcThreadName = "updateThread#local.qryItemsNeedingUpdate.nItemID[local.nQryIdx]#">
        <cfset local.lstThreads = ListAppend(local.lstThreads, local.vcThreadName)>

        <!---create the attributes struct to pass to a thread--->
        <cfset local.stThread = StructNew()>
        <cfset local.stThread.action = "run">
        <cfset local.stThread.name = local.vcThreadName>
        <cfset local.stThread.nItemID = local.qryItemsNeedingUpdate.nItemID[local.nQryIdx]>

        <!---spawn thread--->
        <cfthread attributecollection="#local.stThread#">
            <cfset updateItemPrices(nItemID = attributes.nItemID)>
        </cfthread>
    </cfloop>

    <!---join threads--->
    <cfthread action="join" name="#local.lstThreads#" />
</cfloop>
    <cfcatch type="any">
<cflog text="detailed error message logged here..." type="Error" file="myDailyJob" application="yes">
    </cfcatch>
</cftry>

質問:

この種のロジックはバックグラウンドプロセスに必要ですか?つまり、CFThread action="join"必要ですか?スレッドからは何も表示されず、スレッドは独立しています(他のスレッドまたはそれらを生成したプロセスに依存しないでください)。スレッドはデータベースの価格を更新して終了します。スレッドをスロットルする必要がありますか、つまり、一度に10を実行して、それらを結合する必要がありますか?プロセスがループして、3,500のスレッドすべてを一度に作成できますか?ColdFusionは余分なスレッドをキューに入れ、時間があるときにそれらを実行しますか?

4

1 に答える 1

4

スレッドの完了後にページに情報を出力する必要がない限り、「参加」は必要ありません。

スレッドはキューに入れられます。これは、実行しているColdFusionのバージョンによって異なります。

しかし、あなたがしていることについては、スレッドはあなたが望むものではありません。ActiveMQやAmazonSQSなどのメッセージキューを使用したい。Adobe CFに付属しているActiveMQゲートウェイのようなイベントゲートウェイを使用するか、別のメッセージキューまたはCFエンジンを使用している場合は独自のイベントゲートウェイを作成できます。(たとえば、Amazon SQSとRailoイベントゲートウェイを使用するメッセージングシステムをCFMLで記述しました)

于 2013-01-14T22:02:40.613 に答える