3

我对 ColdFusion 比较陌生(使用 ColdFusion 10),我有一个关于创建实时更新表的问题。

目前我有一个 C# 应用程序,我每 2 秒将股票价格写入 csv(文本)文件,并希望在网页上的表格中反映这些变化。我知道我可以让整个表每 2 秒刷新一次,但这会向服务器产生大量请求,我想知道是否有更好的方法?使用 ColdFusion 10 的新 html5 Web-sockets 功能可以轻松实现这一点吗?

任何关于如何进行或如何实现这一目标的建议/指导将不胜感激!

谢谢,艾伦詹姆斯。

4

2 回答 2

1

我认为您可以重写您的问题并在第一个小时内获得至少 5 个答案。

现在回答它,如果我理解你在问什么。

恕我直言,websockets 还没有,如果你的网站是为广大人群服务的,并且你不能 100% 确定它们是否与最新的 Chrome 或 FF 一起出现,那就算了。

您可以使用一些 javascript websocket 库来优雅地回退到 flash 或 AJAX HTTP 轮询,例如http://socket.io/或云服务,例如 pusher.com 。但这会使您的生活复杂化,因为如果您实施轮询和 websocket,您在后端的工作量会增加 2-3 倍。

关于请求的数量,如果你想要屏幕上的实时数据,你必须有服务器来支持它。

如果您请求一次并刷新所有表格的数据,则可以优化,而不是每个单元格。您将立即获取所有新数据并更新那些使用 jquery 更改的单元格。因此,不要再次提取所有数据或整个表格 HTML,只需提取最少量的数据。

AJAX 轮询肯定会帮助处理请求数量,但请求打开的时间是另一个可能的问题。您甚至可以使用 ColdFusion 9 中的 BlazeDS 进行轮询。

一些要查看的页面:

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

于 2013-08-22T13:45:40.773 回答
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(带有不可靠的浏览器支持)的好处可以忽略不计,不值得编程开销。

谢谢,亨利

于 2013-11-06T12:14:36.330 回答