2009-04-25 8 views
9

J'ai un site utilisant CF8 et Fusebox 5. Chaque fois que j'ai besoin d'ajouter une nouvelle fonctionnalité sur le site, je dois généralement ajouter un nouveau fusible à circuit.xml.cfm pour le contrôleur, le modèle ou la vue, ou tout . Pour activer ces nouvelles fonctionnalités/pages, je vais à l'adresse suivante:Quelle est la meilleure façon de recharger une application Fusebox sans avoir les erreurs "fichier analysé ou répertoire non trouvé"?

?fusebox.load=true&fusebox.parse=true&fusebox.password=password&fusebox.loadclean=true 

Le dernier paramètre est celui que je récemment repris sur et a déterminé que l'utiliser permettrait mes nouveaux fusibles; sans cela, les nouveaux fusibles ne sont pas reconnus. Toutefois, lorsque je fais cela, tous mes fichiers d'analyse qui ont été générés avant sont supprimés. Ce n'est pas vraiment un problème car ils sont régénérés à la volée quand ils sont nécessaires pour la première fois, mais j'ai quelques pages qui retournent des erreurs quand on les accède. L'erreur dit répertoire non trouvé, mais ils sont là, chaque fois que cela arrive, c'est parce que le fichier d'analyse n'existe pas.

Voici un exemple d'une erreur avec la trace de la pile:

Error - Parsed File or Directory not found. 

Date/Time: Apr 25 2009 12:26:02 

Type: fusebox.missingParsedFile 

Message: Parsed File or Directory not found. 

Detail: 

Attempting to execute the parsed file 'login.logout.cfm' threw an error. This can occur if the parsed file does not exist in the parsed directory or if the parsed directory itself is missing. 
Stack Trace: 
    coldfusion.runtime.CustomException: Parsed File or Directory not found. 
    at coldfusion.tagext.lang.ThrowTag.doStartTag(ThrowTag.java:124) 
    at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644) 
    at cffusebox52ecfm1214986498.runPage(C:\example.com\fb5core\fusebox5.cfm:216) 
    at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:192) 
    at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:366) 
    at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644) 
    at cfindex2ecfm584653367.runPage(C:\example.com\index.cfm:3) 
    at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:192) 
    at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:366) 
    at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644) 
    at cfApplication2ecfc1103573364$funcONREQUEST.runFunction(C:\example.com\Application.cfc:36) 
    at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:418) 
    at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:360) 
    at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:324) 
    at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:56) 
    at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:277) 
    at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:192) 
    at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:448) 
    at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:308) 
    at coldfusion.runtime.AppEventInvoker.invoke(AppEventInvoker.java:74) 
    at coldfusion.runtime.AppEventInvoker.onRequest(AppEventInvoker.java:243) 
    at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:269) 
    at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48) 
    at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40) 
    at coldfusion.filter.PathFilter.invoke(PathFilter.java:86) 
    at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70) 
    at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28) 
    at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38) 
    at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46) 
    at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38) 
    at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) 
    at coldfusion.CfmServlet.service(CfmServlet.java:175) 
    at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) 
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:86) 
    at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42) 
    at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46) 
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) 
    at jrun.servlet.FilterChain.service(FilterChain.java:101) 
    at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) 
    at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) 
    at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:284) 
    at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) 
    at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) 
    at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) 
    at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) 
    at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) 
    at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66) 

Ce que je fais pour résoudre ce problème est d'aller à l'adresse suivante, qui est comme la précédente, mais sans fusebox.loadclean = true :

?fusebox.password=password&fusebox.load=true&fusebox.parse=true 

ce que j'ai essayé de faire était après être allé à la première url, je vais à cette seconde, mais l'erreur se pose toujours.

Ce que je cherche, c'est la façon correcte de recharger les circuits sans générer ces erreurs. Je suis le troisième développeur à s'impliquer sur ce site, donc les deux précédents ont eu différents styles de configuration de chaque instance de circuit.xml.cfm. Ces fichiers sont utilisés pour déterminer le flux d'applications de ce qui est nécessaire, des couches de sécurité supplémentaires et la spécification de certains attributs. Voici la méthode Fusebox:

<!-- controller/circuit.xml.cfm --> 
<circuit access="public"> 
    <fuseaction name="index"> 
     <set name="request.title" value="Account overview" /> 
     <do action="layout.header" /> 
     <do action="mdashboard.index" /> 
     <do action="vdashboard.index" /> 
     <do action="layout.footer" /> 
    </fuseaction> 

    <fuseaction name="profile"> 
     <set name="request.title" value="Your Profile" /> 
     <do action="layout.header" /> 

     <!-- form submitted to the same page --> 
     <if condition="isDefined('attributes.submit')"> 
      <true> 
       <do action="mdashboard.updateprofile" /> 
       <do action="vdashboard.profile" /> 
      </true> 
      <false> 
       <do action="mdashboard.profile" /> 
       <do action="vdashboard.profile" /> 
      </false> 
     </if> 

     <do action="layout.footer" /> 
    </fuseaction> 
</circuit> 

<!-- model/circuit.xml.cfm --> 
<circuit access="internal"> 
    <fuseaction name="index"> 
     <include template="sqlIndex" /> 
    </fuseaction> 

    <fuseaction name="profile"> 
     <include template="sqlProfile" /> 
    </fuseaction> 

    <fuseaction name="updateprofile"> 
     <include template="actUpdateProfile" /> 
    </fuseaction> 
</circuit> 

<!-- view/circuit.xml.cfm --> 
<circuit access="internal"> 
    <fuseaction name="index"> 
     <include template="dspIndex" /> 
    </fuseaction> 

    <fuseaction name="profile"> 
     <include template="dspProfile" /> 
    </fuseaction> 
</circuit> 

Voici le mélange de la méthode Fusebox et ColdFusion:

<!-- controller/circuit.xml.cfm --> 
<circuit access="public"> 
    <fuseaction name="index"> 
     <set name="request.title" value="Account overview" /> 
     <do action="layout.header" /> 
     <include template="ctrlIndex" /> 
     <do action="layout.footer" /> 
    </fuseaction> 

    <fuseaction name="profile"> 
     <set name="request.title" value="Your Profile" /> 
     <do action="layout.header" /> 
     <include template="ctrlProfile" /> 
     <do action="layout.footer" /> 
    </fuseaction> 
</circuit> 

<!-- model/circuit.xml.cfm --> 
<circuit access="internal"> 
</circuit> 

<!-- view/circuit.xml.cfm --> 
<circuit access="internal"> 
</circuit> 

<!-- controller/ctrlProfile.cfm --> 
<cfif isDefined("attributes.submit")> 
    <cfinclude template="../model/actUpdateProfile.cfm"> 
</cfif> 

<cfinclude template="../model/sqlPaymentOptions.cfm"> 
<cfinclude template="../view/dspPaymentOptions.cfm"> 

Les deux méthodes sont employées à travers le site, et je ne suis pas opposé à l'utilisation de l'un, mais mon objectif est de réduire toute erreur qui pourrait survenir lorsque l'utilisateur tente d'accéder à une page particulière. Je pensais que peut-être le problème est la méthode mixte de configurations, que je devrais coller, disons, la méthode Fusebox seulement, mais je n'ai pas été en mesure de trouver une tendance commune dans cette erreur. Le gestionnaire d'erreurs que nous avons mis en place m'envoie un mail à chaque fois qu'une page reçoit une erreur, donc je pense que je pourrais automatiquement appeler ma 2ème URL et la rediriger vers la page qui a généré l'erreur quand cette erreur spécifique se produit, mais cela le potentiel d'une boucle infinie, et il ne répond pas au vrai problème.

Est-ce que je vais mal à ce sujet? Y a-t-il un ensemble d'attributs que je peux inclure dans l'URL qui forcera le site à reconnaître de nouveaux fusibles sans effacer mes fichiers d'analyse? Les FC elles-mêmes ne sont pas difficiles à coder, mais je n'en suis pas encore au début, alors je pourrais revenir en arrière. Merci!

Répondre

9

NOTE: Les nouveaux fusibles ne pas besoin d'un reload fusebox - que de nouvelles Fuseactions nécessite un.

Je ne suis pas entièrement certain si les erreurs que vous obtenez sont ce que je pense qu'ils sont, mais ce qui suit est une bonne pratique, peu importe ...

Lorsque vous avez apporté des changements et la nécessité de recharger fusebox, ce que vous devez faire est la suivante:

  1. Déployez le dernier code dans une zone de mise en scène pré-Live sur le même serveur.
    • Générez vos fichiers analysés dans cette zone à l'aide fusebox.parseall=true et fusebox.loadclean=true
    • Copiez tous les fichiers à partir de là dans votre vie Webroot.
    • Effectuez une boîte à fusibles fusebox.load=true sur le site Live - rien d'autre (sauf mot de passe).

(Note: si nécessaire, avant l'étape 3 mis votre site hors ligne/mode maintenance, puis après l'étape 4 le remettre à nouveau en ligne)

+0

C'est exactement ce que je cherche. Déplacer mes fichiers d'analyse de ma mise en scène vers un site en ligne est une excellente idée. Les modifications que je fais aux fuseactions sur le site de transit nécessitent que j'utilise l'élément # 2, mais qu'en est-il lorsque je télécharge les modifications sur le site en ligne? Il suffit de lancer fusebox.load? – Mathachew

+0

Après avoir téléchargé les fichiers analysés, je veux dire. – Mathachew

+0

Ne confondez pas "zone de transfert" avec "site de transit" (c'est-à-dire test/UAT). Vous devez avoir une zone * sur le serveur live * mais * en dehors de la racine principale * où vous pouvez générer vos fichiers analysés, copier tous les fichiers modifiés de cette zone sur la racine Web puis seulement fusebox.load est nécessaire sur le site en ligne. Votre serveur de transfert/test/UAT n'entre pas dans ce processus. –

0

Y at-il raison de ne pas utiliser fusebox .mode = "développement-full-load" (défini dans fusebox.xml)? Cela peut rendre votre vie un peu plus facile, si vous ne développez pas encore dans ce mode.

+0

Puisqu'il parle d'utilisateurs se connectant au site, il est soit en direct ou en test, pas en développement, il devrait donc utiliser mode = "production". –

Questions connexes