没有重启服务器重启应用程序?

时间:2010-06-25 15:10:22

标签: coldfusion

有没有办法在不重启整个服务器的情况下重启ColdFusion应用程序?

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

8 个答案:

答案 0 :(得分:22)

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

如果你不是,你可以尝试@Marcos的建议。我不确定您的申请可能会产生什么后果。我建议实际上是重命名你的应用程序,所以它从一个新的应用程序开始。

答案 1 :(得分:20)

如果您使用的是CF9,请运行ApplicationStop() https://cfdocs.org/applicationstop

答案 2 :(得分:4)

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

<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>

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

答案 3 :(得分:4)

结束应用程序的侵入性较小的方法是暂时将ApplicationTimeout设置为非常短的时间。

以下是application.cfc文件中的一个示例,其中应用程序在10秒内设置为超时,这对于进行更改然后检查来说非常简短:

<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

答案 4 :(得分:3)

<cfset structClear(application) /> 

答案 5 :(得分:3)

如果您使用的是application.cfc,请将其粘贴在onRequestStart函数的顶部:

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

然后你可以将url var传递给任何cfm,应用程序将重置。

答案 6 :(得分:0)

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

&lt; cfset server.runningApplications [“myApp”] =申请/&​​gt;

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

答案 7 :(得分:0)

使用cfinvoke

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