2013-08-20 20 views
3

我對ColdFusion比較陌生(使用ColdFusion 10),我對創建實時更新表有疑問。Coldfusion - 如何實時更新表單元格?

目前,我有我已經股價寫入CSV(文本)每2秒文件,並希望他們在表中出現的網頁上,以反映這些變化的C#應用​​程序。我知道我可以讓整個表每2秒刷新一次,但是這會對服務器產生很多請求,我想知道是否有更好的方法來做到這一點?使用ColdFusion 10的新html5 Web套接字功能可以輕鬆實現嗎?

任何意見/指導何種方式繼續,或如何實現這一點,將不勝感激!

謝謝,AlanJames。

回答

1

我想你可以重寫你的問題,並在第一個小時內至少得到5個答案。

現在回答它,如果我很好地理解你在問什麼。

恕我直言的WebSockets現在還沒有,如果你的網站是廣泛的人羣,你是不是100%地肯定他們與最近的Chrome或FF來了,算了吧。

您可以使用一些JavaScript websocket庫,它可以優雅地回退到Flash或AJAX HTTP輪詢,如http://socket.io/或pusher.com等雲服務。但是這會讓你的生活複雜化,因爲如果你實現了輪詢和websocket,你在後端的工作量會增加2-3倍。

關於請求的數量,如果你想在屏幕上的實時數據,你必須有服務器來支持它。

如果您請求一次刷新所有表數據您可以優化,所以不是每個細胞。你會立即獲得所有新數據並更新那些用jquery更改的單元格。因此,不要再次提取所有數據或整個表格HTML,只需最少量的數據。

AJAX輪詢當然會請求量幫助,請求是開放的時間是另一個可能的問題,但。你可以做輪詢BlazeDS的是,即使在ColdFusion的9

一些網頁查看:

http://www.bennadel.com/blog/2351-ColdFusion-10-Using-WebSockets-To-Push-A-Message-To-A-Target-User.htm

http://www.bennadel.com/blog/1956-Very-Simple-Pusher-And-ColdFusion-Powered-Chat.htm

http://nil.checksite.co.uk/index.cfm/2010/1/28/CF-BlazeDS-AJAX-LongPolling-Part1

+0

非常感謝您花時間回答Zarko。你的回答非常豐富。在試圖找到方向時,我也遇到了HTML5服務器發送事件,它看起來很適合這種情況,因爲我只需要從服務器到客戶端的信息流向一個方向。問題再次出現,就像websocket一樣(正如您在上面指出的那樣),除非您的訪問者擁有最新的瀏覽器,否則將無法工作! – AlanJames

+0

我想我可能會繼續嘗試使用服務器發送的事件,並將回退長輪詢是用戶瀏覽器不支持它。以下是有關Server Sent Events的一些信息,如果有人感興趣 - http://www.html5rocks.com/en/tutorials/eventsource/basics/#toc-introduction,http://html5doctor.com/server-sent-events/ ,http://www.sagarganatra.com/2011/01/server-sent-events-with-html5-and.html – AlanJames

0

沒有一種方式來獲得每2秒實時更新一次,而無需向您的服務器發送某種請求,否則如何知道是否有任何更改?

就我個人而言,我會寫一個CFC方法來讀取您的文本文件,並查看它是否已更改,然後每隔幾秒使用jQuery輪詢該方法以返回它是否已更改,並返回任何更新的內容。

不知道你的文本文件的細節等,很難寫出任何準確的。從根本上講,你的CFC方法必須存儲(可能在SESSION var)一個文本文件數據的副本,所以它可以將它與最新的讀入數據進行比較,並判斷是否有任何改變。如果它已經改變,那麼發送一個結構返回更新,或者返回一個說明它沒有改變的響應。

你CFC代碼會是這個樣子:

<cffunction name="check_update" access="remote" output="false"> 
    <cfset response = structNew()> 
    <cffile action="read" 
     file="path\to\your\textfile.txt" 
     variable="file_content" 
    > 
    <cfif file_content NEQ SESSION.file_content> 
     <cfset response.updated = true> 
     <cfset SESSION.file_content = file_content> 
     <cfset response.content = structNew()> 

     <!--- code here to populate 'content' variable with updated info ---> 

    <cfelse> 
     <cfset response.updated = false> 
    </cfif> 
    <cfreturn response> 
</cffunction> 

然後jQuery代碼來查詢該數據是這樣的:

var update_interval; 
var update_pause = 3000; 

function check_update() { 
    var request = { 
     returnformat : 'json', 
     queryformat : 'column', 
     method: 'check_update' 
    } 
    $.getJSON("path/to/your/service.cfc", request, function(data) { 
     if(data.UPDATED == true) { 
      /* code here to iterate through data.CONTENT */ 
      /* and render out your updated info to your table */ 
     } 
    }); 
} 

$(document).ready(function() { 
    update_interval = setInterval(check_update(), update_pause); 
}); 

所以一旦DOM準備就緒,我們創造的間隔在這種情況下每3秒(3000毫秒)觸發並調用check_update()函數。該功能會打電話給您的CFC,並檢查響應。如果響應UPDATED值爲true,那麼它會運行任何代碼來呈現您的更新。

這是實現你所需要的最直接的方法,應該工作而不管瀏覽器。根據我的經驗,輪詢一個CFC的開銷確實非常小,所傳輸的數據量很小,因此處理應該沒有問題。

我不認爲有任何其他方法可以更輕量級/易於放在一起。長輪詢或SSE(具有惡意瀏覽器支持)的好處是微不足道的,不值得編程開銷。

謝謝亨利