2012-03-27 107 views
4

我有一個web應用程序,它將對提交的數據進行一些處理。我不想讓用戶等待至少需要幾秒鐘的時間,也許在高負載的情況下可能需要幾分鐘時間,但我想知道在Coldfusion中是否有辦法在服務器上進行處理。在服務器上處理

基本上,數據將被傳遞給服務器,然後用戶將被重定向回主頁面,以允許他們做其他事情,但不一定能夠立即看到結果。同時,數據的處理將在服務器上進行,並在完成時輸入到數據庫中。

這甚至ColdFusion的範圍內盡,否則我就需要考慮使用,將接收數據並處理它作爲一個獨立的程序代碼?

+1

baynezy和Antony都爲這個問題提供了很好的解決方案。 Baynezy's非常棒,如果你可能想要使用ColdFusion以外的其他功能進行處理。 Antony的線程建議限制了您可以運行的線程數量以及當時您可能要處理的數據量。 – 2012-03-27 09:53:54

回答

6

的ColdFusion 8引入了cfthread標籤可以幫助你。

<cfthread 
    required 
    name="thread name" 
    optional 
    action="run" 
    priority="NORMAL|HIGH|LOW" 
    zero or more application-specific attributes> 

     Thread code 

    </cfthread> 
+0

本文深入解釋了這種技術:http://www.bennadel.com/blog/1886-Ask-Ben-Processing-Files-With-CFThread-In-ColdFusion.htm – 2012-03-27 03:36:34

+0

這是我看來最好的選擇因爲它不會等待服務檢查,也不會等待外部程序,並將其全部保存在Coldfusion中。 – Computerman1597 2012-03-29 02:24:26

+0

@ jk144的確如此,但是如果您需要在完成任務時向用戶提供視覺反饋,則可能需要推出自己的工作流程。 (您可以隨時發送電子郵件或在課程結束時更新審覈樣式表。) – Antony 2012-03-29 03:17:39

2

另一個可能適用於您的選項是使用AJAX將數據發佈到服務器。這是一個非常容易使用的方法,因爲您可以使用幾乎與您現在使用的完全相同的CF代碼,而只需要修改表單提交頁面(並且甚至可以使用一些不顯眼的JavaScript技術來使其優雅地降級javascript不存在)。

下面是使用jQuery和BlockUI一個例子將爲悄悄地提交以任何形式在頁面上在後臺線程工作:

<script> 
$(function() { 
    $("form").on("submit", function (e) { 
    var f = $(this); 
    e.preventDefault(); 
    $.ajax({ 
     method: f.attr("method"), 
     url: f.attr("action"), 
     data: f.serialize(), 
     beforeSend(jqXHR, settings) { 
     f.blockUI({message: "Loading..."}); 
     }, 
     complete(jqXHR, textStatus) { 
     f.unblockUI(); 
     }, 
     success: function (data, textStatus, jqXHR) { 
     // do something useful with the response 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
     // report the error 
     } 
    }); 
    }); 
}); 
</script> 
3

爲了可靠地做到這一點,你可以使用一個數據庫表作爲作業隊列。所以當用戶提交數據時,你將記錄插入到數據庫中,表明有一些工作要做。然後,在CF管理員中創建一個計劃任務,輪詢腳本從隊列中獲取下一個作業並執行您描述的處理。完成後,它可以更新數據庫,然後可以提醒用戶該作業已完成。

有意義嗎?

1

你應該結合所有這三個答案給自己一個完整的解決方案。

  • 使用CF線程「啓動」工作。
  • 向數據庫添加一條記錄,告訴您該過程正在進行中。
  • 使用Ajax檢查數據庫記錄以查看工作是否完成。當 你的線程完成更新記錄 - Ajax發現工作 完成,並在用戶的屏幕上顯示一些消息或指示器,以便他們可以繼續執行第2步或其他操作。因此,這些 答案中的每一個都對完整的解決方案持有線索。

不知道這應該是一個答案或評論(因爲我沒有在這裏添加任何新東西)。

0

我們爲此使用CF事件網關。用戶通過Web表單提交文件,事件網關監視該上傳目錄。基於文件名,網關知道它應該如何處理文件到數據庫中。這樣,用戶面臨的唯一真正的延遲就是文件實際從機器傳輸到服務器的時間。然而,我們不需要告知用戶任何與這個過程相關的狀態,但是如果我們這樣做了,我們可以很容易地看到如何將這些狀態加入到事情中。