asp版火种--雏形版(三)--用asp模拟多线程
继续上篇
global.asa页面代码:
<SCRIPT RUNAT="Server" LANGUAGE="Javascript">
Server.ScriptTimeOut=99999999;//设置SL的生命周期
function Application_OnStart(){//将代码放在application_onstart事件中
var l=1;
while(l=1){//死循环
try{
xt();//执行错误url连接2秒为心跳周期
}catch(e){//缓存错误
Server.Execute("1.asp");//执行真正的目的代码
}
}
}
将循环放在Application_Onstart{
}的这个括号中会很有问题,因为循环一直执行这个线程是不会放开的,这样虽然SL活了,但是别的用户却无法浏览,换句话说Application_Onstart这个触发事件始终没有完成!这个问题困扰了我好久。
曾走的弯路:
js中没有像vbs中的触发事件,Private Sub Class_Initialize
我曾经用vbs这样写:
================================
<script language="vbscript" runat="server">
sub Application_OnStart
set theprouce=new theclass '如果在sub中声明class会报错 这样可以解决在sub想要class的问题
end sub
Class theclass
Private Sub Class_Initialize
End Sub
Private Sub Class_Terminate
l=1
while l=1
call doit3
wend
End Sub
Private sub doit1
set xmlServerHttp =server.createobject("Msxml2.ServerXMLHTTP")
lResolve = 2 * 1000
lConnect = 2 * 1000
lSend = 2 * 1000
lReceive = 2 * 1000
xmlServerHttp.setTimeouts lResolve, lConnect, lSend, lReceive
xmlServerHttp.open "GET", "http://212.97.224.68/quickstart/aspplus/doc/businessobjs.aspx", false
xmlServerHttp.send
end sub
'-----------
Private sub doit2
set conn=Server.CreateObject("ADODB.Connection")
conntext="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\1\jsser\db.mdb"
conn.open conntext
sql="insert into [db1] ([tt],[cc],[aa])values('1','2','3')"
conn.Execute sql
conn.Close
set conn=null
end sub
Private sub doit3
on error resume next
call doit1
if err.number<>0 then
call doit2
end if
end sub
End Class
但我发现 虽然在字面上是在class关闭时触发事件 但他做事还是在Application_onstart中所以还是没有放开线程的可能,只好放弃vbs,顺便说一句try catch用着真的不如js的方便,真是各有长处呀!哪个都不舍得!呵呵。
找到出路:
实际在global.asa中可用的事件只有4个,相信对asp了解一些的都知道,我把目光转移到了session_onstart(session_onend也一样)上经过多测试验,将运行没问题的代码奉上,
global.asa页面代码:
<SCRIPT RUNAT="Server" LANGUAGE="Javascript">
Server.ScriptTimeOut=99999999;
function Application_OnStart(){
}
function Session_OnStart(){
}
function Session_OnEnd(){
if(Application("key")!=null){//假如SL之key不为空将启动SL
Application("key")=null;//马上将SLkey关闭
setinterval(2000);//2秒为心跳周期
//----------------------
function setinterval(a){
var l=1;
while(l=1){
try{
xt();
}catch(e){
doit();
}
}
function doit(){
var conntext="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
conntext +="E:\\1\\jsser";
conntext +=http://www.cnblogs.com/329521/admin/file://db.mdb/; //这里一写(\)(\)db.mdb编辑器就自己给改了郁闷读者自己改吧。
var conn=Server.CreateObject("ADODB.Connection");
conn.Open(conntext);
var sql2="insert into [db1] ([tt],[cc],[aa])values('1','2','3')";
conn.Execute(sql2);
conn.Close();
conn=null;
}
//----------------
function xt(){
var xmlServerHttp = new ActiveXObject("Msxml2.ServerXMLHTTP");
var lResolve = a;
var lConnect = a;
var lSend = a;
var lReceive = a;
xmlServerHttp.setTimeouts(lResolve, lConnect, lSend, lReceive);
xmlServerHttp.open("GET", "http://212.97.224.68/quickstart/aspplus/doc/businessobjs.aspx", false);
xmlServerHttp.send();
}
}
//----------------------
}
}
function Application_OnEnd(){
Application.StaticObjects.RemoveAll();
}
</SCRIPT>
slkey.asp页面代码:
<script language="js" CODEPAGE="936"%>//读者自己改成%编辑器依然跟我作对!!!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<body>
<%
Session("key")=Session.SessionID;
Application.Lock();
Application("key")=Session("key")+"";
Application.Unlock();
Session.Abandon();
Response.Write("祝贺你的SL之匙已经启动");
%>
</body>
</html>
都放在一个根目录下,cmd下 iisreset 切记取消应用池的默认设置,否则会按着他的时间回收。然后浏览一下slkey.asp观察你的数据库是不是在2秒加一条记录?这时候我没看看session_onend会不会像application_onstart一样被锁住?
test.asp页面代码:
<% js CODEPAGE="936"%>//无语中。。。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>Untitled Document</title>
</head>
<body>
<%
Response.Write(Session("test")+"<br/>应该没有值了");
Session.Abandon();
Session("test")=null;
Response.Write(Session("test")+"");
%>
</body>
</html>
session("值")一样会被消灭!浏览一切正常。还要记住一点slkey最好只有一个人知道,也只有你一个可以启动!到现在他已经完全符合我最初的设想:
Server Live的要求了!Server Live就这样诞生了,真的很高兴!呵呵,再接再厉下一篇我们用application做一个强大的catch。
小结:Server Live的两大靓点:1.他不会随着浏览器的关闭而停止,他会一直工作直到没电或iisreset或生命周期到了。2.他的工作不会影响浏览者的动作(模拟的多线程)。希望对大家有用,那么他适合什么样的应用呢?读者可以自己想,类似股票行情,搜索引擎等。但为了稳定也可以在有条件的情况下,设置一个应用服务器,一个Server Live服务器,一个数据库或application服务器。文章到此,下篇application见。