Есть ли способ перезапустить приложение ColdFusion без перезагрузки всего сервера?
На сервере работают два приложения ColdFusion, и я хочу только перезапустить их.
Есть ли способ перезапустить приложение ColdFusion без перезагрузки всего сервера?
На сервере работают два приложения ColdFusion, и я хочу только перезапустить их.
Если вы используете Application.cfc, вы можете обновить его, чтобы вы могли принудительно вызвать onApplicationStart(), если что-то конкретное передается в URL-адресе или что-то подобное. Просто поместите чек на этот волшебный токен в onRequestStart() и вызовите onApplicationStart(), если он есть.
Если вы этого не сделаете, вы можете попробовать предложение @Marcos. Я не уверен, какие последствия могут иметь ваши приложения. Я бы предложил на самом деле переименовать ваше приложение, поэтому оно начинается как новое приложение.
Если вы находитесь на CF9, запустите ApplicationStop()
https://cfdocs.org/applicationstop
Вот вы, моя CF7/8 версия CF9 ApplicationStop. Я считаю, что это потокобезопасно, отметив комментарий Шона.
<cffunction name="ApplicationStop" returntype="boolean" output="false">
<cfif IsDefined('application')>
<cftry>
<!--- This is just in case there 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/
<cfset structClear(application) />
Менее инвазивным способом прекращения вашего приложения является временная установка 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>
Возможно, вам также потребуется ограничить сеанс. См. эту статью от Ben Nadel для углубленного изучения времени ожидания приложений и сеансов.
Если вы используете application.cfc, поместите это вверху своей функции onRequestStart:
<!--- RESET APP? --->
<cfif isdefined("url.reinit")>
<cfset OnApplicationStart()>
<cfset OnSessionStart()>
</cfif>
Затем вы можете передать url var в любой cfm, а приложение будет reset.
Обычно я помещаю ссылку на каждый пользовательский сеанс в структуру в моей области приложения, чтобы отслеживать, что происходит в приложении. Возможно, что-то подобное в области сервера может помочь здесь. Попробуйте:
< cfset server.runningApplications [ "myApp" ] = Приложение / >
Затем у вас будет ссылка на фактический объект приложения вне области действия этого приложения. Вы могли бы попробовать всевозможные деструктивные вещи, чтобы избавиться от него. Попробуйте это на свой страх и риск!!! И сделайте это на dev-сервере, прежде чем делать это на своей производственной коробке.;)
Используйте cfinvoke
.
<cfinvoke method="onApplicationEnd" component="Application">
<cfinvokeargument name="ApplicationScope" value="#application#" />
</cfinvoke>