2010-06-25 4 views

ответ

21

Если вы используете Application.cfc, вы можете обновить его, чтобы вы могли принудительно вызвать onApplicationStart(), если что-то конкретное передается в URL-адресе или что-то подобное. Просто поместите чек на этот волшебный токен в onRequestStart() и вызовите onApplicationStart(), если он есть.

Если вы этого не сделаете, вы можете попробовать предложение @ Маркоса. Я не уверен, какие последствия могут иметь ваши приложения. Я бы предложил на самом деле переименовать ваше приложение, поэтому оно начинается как новое приложение.

0

Обычно я помещаю ссылку на сессию каждого пользователя в структуру в области приложения, чтобы отслеживать, что происходит в приложении. Возможно, что-то подобное в области сервера может помочь здесь. Попробуйте:

< CFSET server.runningApplications [ "MYAPP"] = Application/>

Тогда вы бы ссылку на реальный объект Application вне рамок этого приложения. Вы могли бы попробовать всевозможные деструктивные вещи, чтобы избавиться от него. Попробуйте это на свой страх и риск !!! И сделайте это на dev-сервере, прежде чем делать это на своей производственной коробке. ;)

19

Если вы на CF9 запустите ApplicationStop()https://cfdocs.org/applicationstop

+6

Это единственное «правильное» решение (и вы должны быть на CF9). Все остальное - сомнительное решение проблемы безопасности потоков. –

3
<cfset structClear(application) /> 
+0

где ответ? – Henry

+0

Сделано предложение видно. : - \ Использовать предварительный просмотр. Кроме того, это предложение уже было дано.Если вы согласитесь, проголосовать за это предложение. Не возвращайте его повторно. –

0

Использование cfinvoke.

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

Я не думаю, что работа onApplicationEnd() будет делать что-нибудь полезное с точки зрения перезапуска приложения. На CF8/CFMX7 вызов onApplicationStart() является самым близким к тому, что вы получите по своему поведению, но будьте осторожны, что он не будет потокобезопасным: CF автоматически вызывает одиночные потоки вызовов onApplicationStart() КОГДА ЭТО ЗВОНОЕТ, но вы можете " Если вы это называете, сделайте это. В CF9, applicationStop() - правильный способ сделать это. –

4

Здесь вы найдете мою 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/

3

Менее инвазивный способ закончить приложение является временно установить 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 для углубленного изучения времени ожидания приложений и сеанса.

2

Если вы используете Application.cfc, придерживаться этого в верхней части вашей функции onRequestStart:

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

Затем вы можете передать URL-адрес вар любому CFM и приложение будет сброшен.