Question

Existe-t-il un moyen de redémarrer le serveur CF via l'application.cfc, lorsque l'application épouse? Selon la documentation d'Adobe, ils ont montré comme suit:

<cffunction name="onApplicationEnd">
    <cfargument name="ApplicationScope" required=true/>
    <cflog file="#This.Name#" type="Information" 
        text="Application #Arguments.ApplicationScope.applicationname# Ended" >
</cffunction>

Ce que je voudrais faire, c'est remplacer le <cflog> au-dessus avec <cfexecute> comme suit:

<cfexecute name = "C:\CFRestart.bat"
    outputFile = "C:\output.txt"
    timeout = "1">
</cfexecute>

Alors OnApplicationEnd exécutera le CFRestart.bat fichier lorsque l'application déroge. c'est possible ou pas?

Était-ce utile?

La solution

OnApplicationEnd est peu susceptible d'être atteint Sauf si vous avez une application très silencieuse car chaque fois que quelqu'un accéde à l'application, le délai d'expiration est réinitialisé.

Je serais très mal à l'aise d'utiliser une application pour redémarrer une instance Coldfusion. Je peux voir toutes sortes de problèmes de sécurité horribles, etc. Pour être honnête, je ne sais pas vraiment pourquoi vous souhaitez redémarrer le serveur si votre application se termine.

En outre, selon les documents OnApplicationEnd, le serveur est redémarré, donc si vous avez fonctionné, lorsque vous redémarrez votre serveur, l'application aurait également un redémarrage de votre serveur. Cela deviendrait très désordonné.

Autres conseils

Ne croyez pas que vous pouvez appeler le script .bat de Coldfusion. Parce qu'une fois, il arrête le service le <cfexecute> se terminera également (pense qu'il s'exécute sous le service CF), n'atteindra jamais le redémarrage.

Deviner que vous avez un serveur qui échoue régulièrement parce que vous frappez une exception hors mémoire (OOM). Pour surmonter la bosse dans ces situations que je configure comme script de lot comme un Tâche planifiée Windows (Voir la première réponse là-bas pour savoir comment) qui redémarre périodiquement le serveur, disons toutes les 24, 12 ou 6 heures. Choisissez un intervalle qui a du sens pour votre situation.

En supposant que OOM est la cause profonde, je suggère de télécharger un Java JDK, de configurer Coldfusion pour l'utiliser (c'est-à-dire JVMHome dans le fichier JVM.Config) et de passer des paramètres pour activer une connexion JMX. Vous utilisez cette connexion JMX pour surveiller Coldfusion à l'aide de VS VIVE, qui est livré avec le JDK. De là, vous pouvez générer un fichier de vidage de tas et / ou dire à la machine virtuelle d'en générer une sur OOM. Tehn j'ai eu un très bon succès à courir à travers le Outil d'analyseur de mémoire Eclipse, qui a un rapport de fuites présumé que plus d'une fois a aidé à retrouver la cause profonde des accidents du serveur OOM.

Si ce n'est pas votre scénario, je vous suggère d'activer des instantanés si vous utilisez Coldfusion Enterprise, sinon CFSTAT est votre ami sur Standard. Pour l'un ou l'autre, vous pouvez aussi Configuration des sondes qui envoient une notification Lorsque le serveur s'exécute lentement. Cela peut vous aider à vous connecter au serveur en question et à générer un vidage au moment approprié ou à identifier si le problème est lié à la place à la place.

Ce n'est peut-être pas votre réponse, mais je l'utilise souvent pour aider la collection des ordures dans la mémoire JVM.

Définissez ceci comme une tâche planifiée pour s'exécuter toutes les 5 minutes, et je n'obtiens plus jamais de problèmes JVM Memmory.

<cfparam name="url.maxused" default="999">
<cfparam name="url.minfree" default="300">

<cfif NOT isDefined("runtime")>
    <Cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()>
</cfif>

<cfset fm = runtime.freememory()/>
<Cfset fm = int((fm/1024)/1024)/>
<cfset usedmem = 1270-fm/>
<cfoutput>
 #Now()#<br>
 Before<br>
 Free: #fm# megs<br>
 Used: #usedmem# megs<br>
</cfoutput>
<br>
<!--- check if we are using too much memory --->
<cfif usedmem gt url.maxused or fm lt url.minfree>
 <cfset runtime.gc()>
 Released Memory<br>
<cfelse>
 No need to release memory using the thresholds you provided<br>
</cfif>
<br>
<cfset fm = runtime.freememory()/>
<Cfset fm = int((fm/1024)/1024)/>
<cfset usedmem = 1270-fm/>
<cfoutput>
After<br>
Free: #fm# megs<br>
Used: #usedmem# megs<br>
</cfoutput>

Cela traîne sans réponse depuis un âge, donc j'ai pensé que je l'aiderais à le nettoyer.

Tout d'abord, ceci: "Erreur de serveur Le serveur a rencontré une erreur interne et n'a pas pu compléter votre demande. N'a pas pu se connecter au serveur JRUN."

Ce n'est pas un délai d'expiration de l'application, c'est juste que le serveur ne répond pas, ou à court de mémoire, ou simplement rencontrer quelque chose qu'il n'aime pas. Mais cela n'a rien à voir avec le synchronisation de l'application.

L'application épouse quand il n'y a pas eu d'activité (c'est-à-dire: pas de demandes de page ... non visiteurs) Sur ce site plus longtemps que la période d'expiration de l'application, qui est par défaut de deux jours (ou tout ce que vous avez défini dans votre application.cfc).

Maintenant ... je peux comprendre pourquoi vous voudrez peut-être récupérer si votre serveur ne répond pas, vous vous approchez de cela sous le mauvais angle. Intriniquement, si le serveur ne fonctionne pas, vous ne pouvez pas utiliser ce serveur pour faire quoi que ce soit (comme guérir lui-même)! Ce qui est généralement fait ici, c'est que un autre Le processus vérifie que le serveur est réactif et si ce service détermine que le serveur n'est pas réactif, il émet un redémarrage.

Vous devez donc consulter un autre logiciel qui peut effectuer une demande HTTP à votre serveur CF, et si la réaction à la demande HTTP suggère que le serveur CF ne répond pas, alors le logiciel de surveillance indique à CF de redémarrer.

Ajouter à la réponse par Stephen Moretti Et peut-être la solution possible que vous recherchiez à votre question intéressante ci-dessus:

L'ONApplicationEnd Exécutera-t-il le fichier BAT Cfrestart lorsque l'application sera le délai d'expiration?

La réponse droite est non. Depuis le OnApplicationEnd() L'événement fait partie du cycle de vie de l'application, donc lorsque l'application elle-même est expirée, il n'y a aucun événement qui sera appelé ici. Cette doit être clair.

En passant directement à votre question cependant, oui, vous pouvez faire un fichier de script personnalisé exécuté lors de l'événement ou une fin d'application (quel que soit le cas). Vous devrez faire face au Serve Scope ici.

Tout d'abord, l'application ne fait pas de temps mort, une demande de page fait. Sur demande délai d'expiration, la fonction OnApplicationEnd () est ne pas appelé. Cela ne s'appelle que si l'application s'arrête. Voici quelques Info Sur le cycle de vie de l'application CF.

Deuxièmement, selon mon expérience, redémarrer les serveurs d'applications pour une raison quelconque masque probablement votre vrai problème. Si votre application s'exécute lente / écrasant etc. Ensuite, je vous suggère de regarder dans le réel Raison que cela se produit plutôt que de le redémarrer.

Cependant, je ne peux pas penser à une raison que cela ne fonctionnerait pas en principe, mais je vous suggère de effectuer un test rapide si c'est vraiment ce que vous souhaitez faire.

J'espère que cela pourra aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top