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