重新启动应用程序而无需重新启动服务器?

重新启动应用程序而无需重新启动服务器?

问题描述:

有没有一种方法可以在不重新启动整个服务器的情况下重新启动ColdFusion应用程序?重新启动应用程序而无需重新启动服务器?

有两个ColdFusion应用程序在服务器上运行,我只想重新启动其中一个。

如果您使用的是Application.cfc,则可以对其进行更新,以便在url中传递特定的内容或类似内容时强制对onApplicationStart()进行调用。只需在onRequestStart()中检查该魔术标记,如果是,则调用onApplicationStart()。

如果你不是,你可以尝试@马科斯的建议。我不确定你的应用程序可能会有什么后果。我所建议的实际上是重命名你的应用程序,所以它开始作为一个新的应用程序。

我通常会将每个用户会话的引用放入我的应用程序范围中的结构中,以监视应用程序中发生了什么。也许在服务器范围内做类似的事情可能会有帮助。尝试:

< CFSET server.runningApplications [“对myApp”] =应用程序/ >

然后,你有该应用程序的范围之外,以实际的应用对象的引用。你可以尝试各种破坏性的东西来摆脱它。试试这个需要您自担风险!在您的生产箱上完成之前,先在开发服务器上执行此操作。 ;)

如果你在CF9,运行ApplicationStop()https://cfdocs.org/applicationstop

+6

这是唯一的'正确的'解决方案(你必须在CF9上)。其他的一切都是潜在的线程安全问题的一个可疑的解决方法。 – 2010-06-25 22:34:40

<cfset structClear(application) /> 
+0

答案在哪里? – Henry 2010-06-25 17:49:22

+0

使建议可见。 : - \使用预览。此外,该建议已经提供。如果您同意,请提出该建议。不要重新提交。 – 2010-06-25 20:54:33

使用cfinvoke

<cfinvoke method="onApplicationEnd" component="Application"> 
    <cfinvokeargument name="ApplicationScope" value="#application#" /> 
</cfinvoke> 
+2

我不认为运行onApplicationEnd()会导致应用程序重新启动。在CF8/CFMX7上,调用onApplicationStart()是最接近你想要的行为 - 但要注意它不会是线程安全的:CF会自动调用单个线程到onApplicationStart()当它调用它时,当你打电话时不要这么做。在CF9上,applicationStop()是正确的方法。 – 2010-06-25 22:33:42

在这里,我来说说,我的CF7/8版本的CF9的ApplicationStop。我相信这是线程安全的,注意到肖恩的评论。

<cffunction name="ApplicationStop" returntype="boolean" output="false"> 
<cfif IsDefined('application')> 
    <cftry> 
    <!--- This is just in case there's no app scope but variables.application ---> 
    <cfset CreateObject('java', 'coldfusion.runtime.ApplicationScopeTracker').cleanUp(application) /> 
    <cfreturn true /> 
    <cfcatch type="any"></cfcatch> 
    </cftry> 
</cfif> 
<cfreturn false /> 
</cffunction> 

正如亨利所说,他是我关于这个问题的博客文章: http://misterdai.wordpress.com/2010/06/14/cf-flag-application-to-run-onapplicationstart-part-2/

结束你的应用的微创治疗方法是将ApplicationTimeout临时设置的东西很短。

这是从哪儿应用程序被设置在10秒超时的情况下的Application.cfc文件,这是很多短的做出改变,然后检查回来的例子:

<cfcomponent displayname="Application"> 
    <cfscript> 
     this.name = "myAppName"; 
     this.setclientcookies="yes"; 
     this.sessionmanagement="yes"; 
     this.sessiontimeout= CreateTimeSpan(0,0,60,0); 
     this.applicationTimeout= CreateTimeSpan(0,0,0,10); 
    </cfscript> 
    ... 
</cfcomponent> 

您可能需要限制会议也是如此。有关深入了解应用程序和会话超时的信息,请参阅this article by Ben Nadel

如果您正在使用的Application.cfc,你onRequestStart函数的顶部坚持这样的:

<!--- RESET APP? ---> 
<cfif isdefined("url.reinit")> 
    <cfset OnApplicationStart()> 
    <cfset OnSessionStart()> 
</cfif> 

然后,你可以通过一个URL VAR任何CFM和应用程序将重置。