Есть ли способ перезапустить приложение ColdFusion без перезагрузки всего сервера?перезапустить приложение без перезапуска сервера?
На сервере есть два приложения ColdFusion, и я хочу только перезапустить один из них.
Есть ли способ перезапустить приложение ColdFusion без перезагрузки всего сервера?перезапустить приложение без перезапуска сервера?
На сервере есть два приложения ColdFusion, и я хочу только перезапустить один из них.
Если вы используете Application.cfc, вы можете обновить его, чтобы вы могли принудительно вызвать onApplicationStart(), если что-то конкретное передается в URL-адресе или что-то подобное. Просто поместите чек на этот волшебный токен в onRequestStart() и вызовите onApplicationStart(), если он есть.
Если вы этого не сделаете, вы можете попробовать предложение @ Маркоса. Я не уверен, какие последствия могут иметь ваши приложения. Я бы предложил на самом деле переименовать ваше приложение, поэтому оно начинается как новое приложение.
Обычно я помещаю ссылку на сессию каждого пользователя в структуру в области приложения, чтобы отслеживать, что происходит в приложении. Возможно, что-то подобное в области сервера может помочь здесь. Попробуйте:
< CFSET server.runningApplications [ "MYAPP"] = Application/>
Тогда вы бы ссылку на реальный объект Application вне рамок этого приложения. Вы могли бы попробовать всевозможные деструктивные вещи, чтобы избавиться от него. Попробуйте это на свой страх и риск !!! И сделайте это на dev-сервере, прежде чем делать это на своей производственной коробке. ;)
Если вы на CF9 запустите ApplicationStop()
https://cfdocs.org/applicationstop
<cfset structClear(application) />
где ответ? – Henry
Сделано предложение видно. : - \ Использовать предварительный просмотр. Кроме того, это предложение уже было дано.Если вы согласитесь, проголосовать за это предложение. Не возвращайте его повторно. –
Использование cfinvoke
.
<cfinvoke method="onApplicationEnd" component="Application">
<cfinvokeargument name="ApplicationScope" value="#application#" />
</cfinvoke>
Я не думаю, что работа onApplicationEnd() будет делать что-нибудь полезное с точки зрения перезапуска приложения. На CF8/CFMX7 вызов onApplicationStart() является самым близким к тому, что вы получите по своему поведению, но будьте осторожны, что он не будет потокобезопасным: CF автоматически вызывает одиночные потоки вызовов onApplicationStart() КОГДА ЭТО ЗВОНОЕТ, но вы можете " Если вы это называете, сделайте это. В CF9, applicationStop() - правильный способ сделать это. –
Здесь вы найдете мою CF7/8 версию ApplicationStop CF9. Я считаю, что это потокобезопасно, отметив комментарий Шона.
<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 к чему-то очень короткое.
Вот пример из файла 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 для углубленного изучения времени ожидания приложений и сеанса.
Если вы используете Application.cfc, придерживаться этого в верхней части вашей функции onRequestStart:
<!--- RESET APP? --->
<cfif isdefined("url.reinit")>
<cfset OnApplicationStart()>
<cfset OnSessionStart()>
</cfif>
Затем вы можете передать URL-адрес вар любому CFM и приложение будет сброшен.
Это единственное «правильное» решение (и вы должны быть на CF9). Все остальное - сомнительное решение проблемы безопасности потоков. –