我有一个长期运行的vb6 Com对象,从经典的asp页面调用
当没有很多事可做时它会很有效,但是如果必须做很多事情就会超时。
是否有一种方法可以将其称为异步,因此它不会超时或
我可以调用进度条来继续刷新客户端,以便它不会超时吗?
Set objQReport = Server.CreateObject("ReportGenerator")
mainRpt = objQReport.GenerateReport(MySessionRef) ' times out here sometimes
Set objQReport = nothing
任何提示都会有所帮助
答案 0 :(得分:2)
Web技术并不适合长时间运行的任务,但您有几种选择:
一个选项是对第二个ASP页面进行AJAX调用。一旦你运行ASP,服务器就会完成这个过程,即使客户端(进行实际调用的浏览器/ AJAX)不再连接。
此方法 使用网络技术处理长时间运行的任务,缺点是您正在通过执行此长时间运行的任务来增加IIS计算机的负担,为IIS擅长的东西留下较少的性能;提供网页。
因此,在您的目标网页(例如default.asp)中,对您的(长时间运行的)报告页面执行AJAX调用。如何进行ajax调用取决于你使用的是什么(如果有的话)javascript库。在Jquery中它会是这样的:
<script type="text/javascript">
/* AJAX call to start the report generation */
$(document).ready(function(){
$.get("[URL_OF_YOUR_LONG_RUNNING_PROCESS]", function(data)
{
alert(data);
});
});
</script>
正如您所看到的,我正在提醒从此URL返回的任何数据,但在您的情况下可能不是您想要的。您希望访问者在长时间运行的过程中继续工作时继续浏览。
这样,URL就是异步调用的。服务器将开始处理URL,浏览器不必等待它。服务器将继续并在后台完成长时间运行的任务。
请注意您仍需要在运行长进程的asp页面上增加server.scripttimeout 。这只是确保用户可以继续浏览,服务器仍将遵循配置的server.scripttimeout设置,如果花费的时间太长则会失败。
广泛使用的第二种选择是使用消息队列。消息队列接受消息并保证传递这些消息,即使计算机或网络出现故障也是如此。
Microsoft Windows内置了MSMQ(您必须在软件设置中启用它),您可以使用传统的ASP。队列将存储消息并将其传递给使用者。消费者是你自己需要写的东西;一个可以读取队列并处理内部消息的应用程序。
您所做的是让ASP向MSMQ写一条消息,其中包含有关要执行的任务及其参数的信息。
您的消费者应用程序必须轮询MSMQ,阅读消息并启动长时间运行的进程。然后,它将完全独立于IIS运行,甚至可以在完全不同的计算机上运行(MSMQ可以跨网络运行)。
第二种方法的缺点是你必须编写一个消费者,最有可能是用VB或C#这样的低级语言(尽管你可能能够使用Python),最好把它写成一项服务。我不知道你在这些语言中有多舒服,但是如果你自己编写了COM对象,那么在VB6中编写一个可执行文件来轮询MSMQ并调用COM对象将是微不足道的。 以下是一些帮助您入门的链接。
http://support.microsoft.com/kb/173339
http://technosock.blogspot.nl/2007/07/microsoft-message-queue-from-classical.html
http://www.informit.com/articles/article.aspx?p=131272&seqNum=6
希望这有帮助,
埃里克