如何做一个最完美的实时数据传输程序
2008-04-24 12:29
691 查看
如何做一个最完美的实时数据传输程序
年底公司没什么事,看到同事们都在刷各个不同的二手火车票网站,因为要得到最新信息要不停的F5,所以我想做一个实时更新最新数据的web程序,反正也没什么事情做。
我的思路是:利用ajax每秒访问数据库一次,如果有最新的数据就返回最新数据,完成小demo,功能也实现了,但是同事觉得我的思路不好,因为不停的访问数据库会影响效率,公司是做税务的,效率总是放在第一位的。
同事也提供了一个思路,利用ajax每秒访问后台但是不允许数据库,利用oracle的触发器,如果有新数据插入就允许访问相关数据库数据。
不知道能否用触发器控制一段java代码,这个暂且不说,就算可以实现效率会提高多少?
不知道大家是否有什么看法和新的思路,怎么样才能做一个最完美的实时数据传输程序。
我的实现思路如下:
实现通过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
年底公司没什么事,看到同事们都在刷各个不同的二手火车票网站,因为要得到最新信息要不停的F5,所以我想做一个实时更新最新数据的web程序,反正也没什么事情做。
我的思路是:利用ajax每秒访问数据库一次,如果有最新的数据就返回最新数据,完成小demo,功能也实现了,但是同事觉得我的思路不好,因为不停的访问数据库会影响效率,公司是做税务的,效率总是放在第一位的。
同事也提供了一个思路,利用ajax每秒访问后台但是不允许数据库,利用oracle的触发器,如果有新数据插入就允许访问相关数据库数据。
不知道能否用触发器控制一段java代码,这个暂且不说,就算可以实现效率会提高多少?
不知道大家是否有什么看法和新的思路,怎么样才能做一个最完美的实时数据传输程序。
我的实现思路如下:
实现通过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
相关文章推荐
- 如何写一个完美的socket多线程通信程序 ?(持续更新中...)
- 在一个程序中调用另一个程序并且传输数据到选择屏幕执行这个程序
- 如何编写一个能读取Powerbuilder的数据窗口中数据的程序
- 本程序说明了如何建立一个可以接收UDP客户端数据的UDP 服务器
- 如何在Win32窗口程序中发命令打开一个控制台,往里面打印(printf())输出一些数据
- 考虑下列生成二进制的过程,编译器被用来生成单个单元的目标代码,链接器被用来将多个目标单元合并成一个程序二进制,链接器如何改变指令和数据到内存地址的绑定?需要什么信息从编译器传递给链接器,以协助完成链接
- 微信小程序编译过程中如何将一个页面的数据传到另一个页面呢
- 在一个程序中需要用到全局变量(在多个class之间共享数据),请问如何定义具有这种功能的变量?或者是否有其他的方法解决多个class之间的数据共享(尽量简单实现)。 首先应该明确 Java中没有全局变
- 对于一个具有几百万粉丝的用户,数据如何实时投递到所有用户? -- 德问精彩回答
- 本程序说明了如何建立一个简单的可以接收UDP服务器数据的UDP客户端
- oracle如何删除一个用户下的所有数据?
- 如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程。
- 如何构造一个C#语言的爬虫程序开发者在线 Builder.com.cn 更新时间:2008-07-20作者: 来源:
- 如何开发一个SocketServer-Client模型的程序
- java 程序里如何实现从一个列表中拖动一个元素到另一个列表中?
- 网页中实现一个计算当年还剩多少时间的倒数计时程序,要求网页上实时动态显示"××年还剩××天××时××分××秒"
- 如何用一个数据库的数据去更新另一个数据库的内容 (转)
- JDBC链接MySQL的一个相对完美的小程序
- 【笔试】超大文件里的数据去重排序;将log中MAC地址提取出来;取出数据库表T里第20行到29行的数据;如何判断一个二叉树B是不是二叉树A的子树?
- 如何恢复一个只有完好数据文件的Oracle数据库?