restart application without restarting server?

吃可爱长大的小学妹 提交于 2019-12-17 19:08:16

问题


Is there a way to restart a ColdFusion application without restarting the entire server?

There are two ColdFusion applications running on a server and I only want to restart one of them.


回答1:


If you are using Application.cfc, you can update it so that you can force a call to onApplicationStart() if something specific is passed in the url, or something similar. Simply place a check for that magic token in onRequestStart(), and call onApplicationStart() if it is.

If you are not, you can try @Marcos's suggestion. I'm not sure what ramifications that may have in your application. What I would suggest is actually renaming your application, so it starts as a new app.




回答2:


If you're on CF9, run ApplicationStop() https://cfdocs.org/applicationstop




回答3:


Here you go, my CF7/8 version of CF9's ApplicationStop. I believe this is thread safe, noting Sean's comment.

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

As mentioned by Henry, he's my blog post on the subject: http://misterdai.wordpress.com/2010/06/14/cf-flag-application-to-run-onapplicationstart-part-2/




回答4:


A less invasive way of ending your app is to temporarily set the ApplicationTimeout to something very short.

Here is an example from an application.cfc file where the app is set to timeout in 10 seconds, which is plenty short for making a change and then checking back:

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

You might need to limit the session, too. See this article by Ben Nadel for an in-depth look at Application and Session timeouts.




回答5:


<cfset structClear(application) /> 



回答6:


If you are using application.cfc, stick this at the top of your onRequestStart function:

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

Then you can pass a url var to any cfm and the app will reset.




回答7:


I usually put a reference to each user's session into a struct in my Application scope to monitor what's going on in the app. Maybe doing something similar in the Server scope could help here. Try:

<cfset server.runningApplications["myApp"] = Application />

Then you'd have a reference to the actual Application object outside the scope of that application. You could try all manner of destructive things to get rid of it. Try this at your own risk!!! And do it on a dev server before you do it on your production box. ;)




回答8:


Use cfinvoke.

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


来源:https://stackoverflow.com/questions/3119119/restart-application-without-restarting-server

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!