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

Posted

技术标签:

【中文标题】重新启动应用程序而不重新启动服务器?【英文标题】:restart application without restarting server? 【发布时间】:2011-03-08 08:11:55 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

然后,您将获得对该应用程序范围之外的实际应用程序对象的引用。你可以尝试各种破坏性的方法来摆脱它。试试这个,后果自负!!!在你的生产机器上做之前,先在开发服务器上做。 ;)

【讨论】:

【参考方案3】:

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

【讨论】:

这是唯一“正确”的解决方案(您必须使用 CF9)。其他一切都是可疑的解决方法,存在潜在的线程安全问题。【参考方案4】:
<cfset structClear(application) /> 

【讨论】:

使建议可见。 :-\ 使用预览。而且,这个建议已经给出了。如果您同意,请投票赞成该建议。不要重新提交。【参考方案5】:

使用cfinvoke

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

【讨论】:

我认为运行 onApplicationEnd() 在导致应用程序重新启动方面不会做任何有用的事情。在 CF8 / CFMX7 上,调用 onApplicationStart() 是最接近你想要的行为的方法 - 但要注意它不是线程安全的:当它调用它但你可以时,CF 会自动单线程调用 onApplicationStart()当你调用它时不要这样做。在 CF9 上,applicationStop() 是执行此操作的正确方法。【参考方案6】:

给你,我的 CF9 的 ApplicationStop 的 CF7/8 版本。注意到 Sean 的评论,我相信这是线程安全的。

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

【讨论】:

【参考方案7】:

结束应用程序的侵入性较小的方法是将 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 以深入了解应用程序和会话超时。

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

以上是关于重新启动应用程序而不重新启动服务器?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ConfigurationManager.RefreshSection 重新加载配置而不重新启动应用程序

sh 在Mac OS X上重新启动蓝牙守护程序而不重新启动

sh 在Mac OS X上重新启动蓝牙守护程序而不重新启动

重新加载 PyQt5 应用程序而不先重新启动它

Spring Boot,更新前端而不重新启动应用程序

更改语言而不重新启动活动