2010-06-25 4 views

Répondre

21

Si vous utilisez Application.cfc, vous pouvez le mettre à jour de sorte que vous puissiez forcer un appel à onApplicationStart() si quelque chose de spécifique est passé dans l'URL, ou quelque chose de similaire. Placez simplement une vérification pour ce jeton magique dans onRequestStart(), et appelez onApplicationStart() si c'est le cas.

Si ce n'est pas le cas, vous pouvez essayer la suggestion de @ Marcos. Je ne suis pas sûr des ramifications qui peuvent avoir dans votre application. Ce que je suggérerais, c'est de renommer votre application, donc ça commence comme une nouvelle application.

0

Généralement, je mets une référence à la session de chaque utilisateur dans une structure de ma portée Application pour surveiller ce qui se passe dans l'application. Peut-être que faire quelque chose de similaire dans la portée du serveur pourrait aider ici. Essayez:

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

Ensuite, vous auriez une référence à l'objet Application réelle en dehors du champ d'application de cette application. Vous pouvez essayer toutes sortes de choses destructrices pour vous en débarrasser. Essayez ceci à vos risques et périls !!! Et faites-le sur un serveur de développement avant de le faire sur votre boîte de production. ;)

19

Si vous êtes sur CF9, exécutez ApplicationStop()https://cfdocs.org/applicationstop

+6

Ceci est la seule solution 'correcte' (et vous devez être sur CF9). Tout le reste est une solution de contournement douteuse avec des problèmes potentiels de sécurité de thread. –

3
<cfset structClear(application) /> 
+0

où est la réponse? – Henry

+0

Suggestion faite visible. : - \ Utiliser l'aperçu. En outre, cette suggestion avait déjà été donnée.Si vous êtes d'accord, votez pour cette suggestion. Ne pas le soumettre à nouveau. –

0

Utilisez cfinvoke.

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

Je ne pense pas que l'exécution de onApplicationEnd() fera quoi que ce soit d'utile pour provoquer le redémarrage d'une application. Sur CF8/CFMX7, l'appel onApplicationStart() est le plus proche du comportement que vous voulez - mais attention, il ne sera pas sûr pour les threads: CF appelle automatiquement les threads à onApplicationStart() QUAND IL APPELLE, mais vous pouvez ' Je fais ça quand tu l'appelles. Sur CF9, applicationStop() est la manière correcte de le faire. –

4

Voilà ma version CF7/8 de l'ApplicationStop de CF9. Je crois que c'est thread safe, notant le commentaire de Sean.

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

Comme mentionné par Henry, il est mon blog sur le sujet: http://misterdai.wordpress.com/2010/06/14/cf-flag-application-to-run-onapplicationstart-part-2/

3

Une façon moins invasive de mettre fin à votre application est de mettre temporairement le ApplicationTimeout à quelque chose de très court.

Voici un exemple d'un fichier application.cfc où l'application est réglé sur délai d'attente en 10 secondes, ce qui est beaucoup court pour faire un changement et le contrôle de retour:

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

Vous pourriez avoir besoin de limiter la session aussi. Voir this article by Ben Nadel pour un aperçu détaillé des délais d'application et de session.

2

Si vous utilisez application.cfc, ce bâton en haut de votre fonction onRequestStart:

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

Ensuite, vous pouvez passer un var url à tout cfm et l'application réinitialisera.

Questions connexes