论坛首页 Web前端技术论坛

如何做一个最完美的实时数据传输程序

浏览 5324 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-02-01  
               如何做一个最完美的实时数据传输程序  

   年底公司没什么事,看到同事们都在刷各个不同的二手火车票网站,因为要得到最新信息要不停的F5,所以我想做一个实时更新最新数据的web程序,反正也没什么事情做。
    我的思路是:利用ajax每秒访问数据库一次,如果有最新的数据就返回最新数据,完成小demo,功能也实现了,但是同事觉得我的思路不好,因为不停的访问数据库会影响效率,公司是做税务的,效率总是放在第一位的。
     同事也提供了一个思路,利用ajax每秒访问后台但是不允许数据库,利用oracle的触发器,如果有新数据插入就允许访问相关数据库数据。
     不知道能否用触发器控制一段java代码,这个暂且不说,就算可以实现效率会提高多少?
     不知道大家是否有什么看法和新的思路,怎么样才能做一个最完美的实时数据传输程序。






ps:大家新年快乐,希望那些没买到票的都能买到票,能够顺利的回家过年。
   发表时间:2008-02-02  

我的实现思路如下:

实现通过DWR Reverse Ajax调用EXTJS的Observable Class(Java CODE)

Collection<ScriptSession> sessions = serverContext.getScriptSessionsByPage(pageUrl);
        logger.debug("the page:{} url's session size is {}", pageUrl,sessions.size());
        ScriptBuffer script = new ScriptBuffer();
        script.appendScript("cti.fireVoiceEvent(")
          .appendData(event)
          .appendScript(");");
        logger.debug("the script is {}", script);
        for(ScriptSession session:sessions){
            logger.warn("session id is {}", session.getId());
            session.addScript(script);
        }

cti.js如下:

Ext.namespace('cti');
cti.Voice = function(){
        this.addEvents({
        "dialing" : true,
        "ringing" : true,
        "established" : true,
        "released" : true
    });
   
   
       
};
Ext.extend(cti.Voice, Ext.util.Observable);
cti.VoiceCallBack = new cti.Voice();
cti.fireVoiceEvent = function(event){
    var runFireEvent = cti.VoiceCallBack.fireEvent.bind(cti.VoiceCallBack);
    runFireEvent(event.name,event);
}

 

然后在Voice.js处理,各种Event事件如下:

Ext.onReady(function(){
   
   
   
    var targetDN = Ext.get('targetDN');
    var thisDN = Ext.get('thisDN');
    var connId = Ext.get('connId');
   
    //make call
    var makeCallButton = Ext.get('makeCallButton');
    var onMakeCall = function() {
        cti_voiceService.makeCall(thisDN.getValue(),targetDN.getValue());
    };
   
    makeCallButton.on('click',onMakeCall);
   
    //answer call
    var answerButton = Ext.get('answerButton');
    var onAnswer = function() {
        cti_voiceService.answer(thisDN.getValue(),connId.getValue());
    };
   
    answerButton.on('click',onAnswer);
   
    //release call
    var releaseButton = Ext.get('releaseButton');
    var onRelease = function() {
        cti_voiceService.release(thisDN.getValue(),connId.getValue());
    };
   
    releaseButton.on('click',onRelease);
   
    //logout
    var logoutButton = Ext.get('logoutButton');
    var onLogout = function() {
        cti_voiceService.release(thisDN.getValue(),connId.getValue());
        cti_voiceService.logout(thisDN.getValue());
    };
   
    logoutButton.on('click',onLogout);
   
    Ext.EventManager.on(window, 'unload', function() {
       cti_voiceService.release(thisDN.getValue(),connId.getValue());
        cti_voiceService.logout(thisDN.getValue());
    }); 

   
    //onRinging Event Handler

var onRinging = function(ev){

    cti.onStateChange(ev);

    document.voice.connId.value = ev.connID;
        document.voice.thisDN.value = ev.thisDN;
        document.voice.answerButton.disabled = false;
        document.voice.releaseButton.disabled = true;
    };
   
    cti.VoiceCallBack.on('ringing',onRinging);
   

//onDialing Event Handler
    var onDialing = function(ev){
        cti.onStateChange(ev);
        document.voice.connId.value = ev.connID;
        document.voice.answerButton.disabled = true;
        document.voice.releaseButton.disabled = true;
    };
   
    cti.VoiceCallBack.on('dialing',onDialing);
   
    var onEstablished = function(ev){
        cti.onStateChange(ev);
        document.voice.connId.value = ev.connID;
        document.voice.answerButton.disabled = true;
        document.voice.releaseButton.disabled = false;
    };
   
    cti.VoiceCallBack.on('established',onEstablished);
   
    var onReleased = function(ev){
        cti.onStateChange(ev);
        document.voice.connId.value = ev.connID;
        document.voice.thisDN.value = ev.thisDN;
        document.voice.answerButton.disabled = true;
        document.voice.releaseButton.disabled = true;
    };
   
    cti.VoiceCallBack.on('released',onReleased);
   
   
    cti.reverseAjax();
   
   
   
   
})

 

这只是其中一种实现方式而已。Reverse ajax还可以通过NIO Socket向IE/FF的Applet Socket Client发送JSon Event,由Applet执行当前页面的fireEvent。

可以通过Spring,配置不同的Reverse ajax实现方式。如果有什么不理解的,请随时找我。 rasonyang@hotmail.com

0 请登录后投票
   发表时间:2008-02-07  
ls一下子就一片代码, 像我这样没用过ajax的人看得累啊.
能不能把你的实现原理描述一下?
0 请登录后投票
   发表时间:2008-02-15  
JavaScript可以通过Extjs实现OBserver模式
然后,就是通过Applet或者DWR Reverse ajax,
让Server fire json Event让javascript onEvent
0 请登录后投票
   发表时间:2008-02-15  
你试http长连接Comet服务器推技术,这个是不断地建立30秒长的连接,相当于跟服务器建立了socket连接,是属于实时数据提取的.
http://www.examda.com/Java/zhuangye/20070908/113416646.html
0 请登录后投票
   发表时间:2008-03-03  
利用二楼的技术应该可以了。DWR2.0就是用的Comet技术进行事件触发推送消息 的。
0 请登录后投票
   发表时间:2008-03-03  
利用二楼的技术应该可以了。DWR2.0就是用的Comet技术进行事件触发推送消息 的。
0 请登录后投票
   发表时间:2008-03-03  
如果你只是担心数据库的压力,而不在乎web服务器的压力(通常确实如此),那没有必要用其他技术,只需要在web服务器上合理的做缓存就可以了,比如你的web服务器程序保持cache是5秒,只有超过5秒才会重新访问一次数据库。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics