2010-06-25 22 views

Antwort

21

Wenn Sie Application.cfc verwenden, können Sie sie aktualisieren, sodass Sie einen Aufruf von onApplicationStart() erzwingen können, wenn in der URL etwas Bestimmtes oder Ähnliches übergeben wird. Platzieren Sie in onRequestStart() einfach ein Häkchen für dieses magische Token, und rufen Sie onApplicationStart() auf, falls dies der Fall ist.

Wenn Sie nicht sind, können Sie @ Marcos Vorschlag versuchen. Ich bin mir nicht sicher, welche Auswirkungen dies in Ihrer Anwendung haben könnte. Was ich vorschlagen würde, ist eigentlich Ihre Anwendung umbenennen, so dass es als eine neue App beginnt.

0

Normalerweise verweise ich eine Referenz auf die Sitzung jedes Benutzers in eine Struktur in meinem Anwendungsbereich, um zu überwachen, was in der App passiert. Vielleicht könnte hier etwas Ähnliches im Serverbereich helfen. Versuchen:

< cfset server.runningApplications [ „myApp“] = Anwendung/>

Dann sind Sie nicht in den Anwendungsbereich dieser Anwendung einen Verweis auf die tatsächliche Anwendungsobjekt haben würde. Du könntest alle Arten von zerstörerischen Dingen versuchen, um es loszuwerden. Versuchen Sie dies auf eigene Gefahr !!! Und tun Sie es auf einem Dev-Server, bevor Sie es auf Ihrer Produktionsbox tun. ;)

19

Wenn Sie auf CF9 sind, laufen ApplicationStop()https://cfdocs.org/applicationstop

+6

Dies ist die einzige "richtige" Lösung (und Sie müssen auf CF9 sein). Alles andere ist eine zweifelhafte Problemumgehung mit möglichen Thread-Sicherheitsfragen. –

3
<cfset structClear(application) /> 
+0

Wo ist die Antwort? – Henry

+0

Vorgeschlagener Vorschlag sichtbar. : - \ Verwenden Sie die Vorschau. Auch dieser Vorschlag wurde bereits gegeben.Wenn Sie einverstanden sind, stimmen Sie diesen Vorschlag ab. Übermitteln Sie es nicht erneut. –

0

Verwendung cfinvoke.

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

Ich glaube nicht, dass das Ausführen von onApplicationEnd() irgendetwas Nützliches in Bezug auf den Neustart einer Anwendung verursachen wird. Auf CF8/CFMX7 ist das Aufrufen von onApplicationStart() das Ergebnis, das Sie am ehesten erreichen - aber seien Sie vorsichtig, dass es nicht threadsicher ist: CF ruft automatisch Threads zu onApplicationStart() WENN ES ANRUFT, aber Sie können Tu das, wenn du es nennst. Auf CF9 ist ApplicationStop() der richtige Weg, dies zu tun. –

4

Hier gehen Sie, meine CF7/8 Version von CF9 ApplicationStop. Ich glaube, das ist threadsicher und notiert Seans Kommentar.

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

Wie Henry erwähnt, er ist mein Blog-Post über das Thema: http://misterdai.wordpress.com/2010/06/14/cf-flag-application-to-run-onapplicationstart-part-2/

3

Eine weniger invasive Art und Weise Ihre Anwendung zu beenden ist, um die ApplicationTimeout zu etwas sehr kurz vorübergehend eingestellt. Hier

ist ein Beispiel aus einer Application.cfc Datei, in der die App eingestellt wird in 10 Sekunden Timeout, die für die Herstellung einer Änderung viel kurz und dann die Kontrolle zurück:

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

Sie müssen möglicherweise begrenzen die Sitzung auch. Eine detaillierte Beschreibung der Timeouts für Anwendungen und Sitzungen finden Sie unter this article by Ben Nadel.

2

Wenn Sie mit Application.cfc, kleben diese an der Spitze Ihrer onRequestStart Funktion:

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

Dann können Sie eine URL var einem cfm passieren und die App wird zurückgesetzt.