Каков наилучший способ перезагрузить приложение Fusebox, не получая проанализированный файл или каталог, не найденный?

У меня есть сайт, использующий CF8 и Fusebox 5. Каждый раз, когда мне нужно добавить новую функцию на сайт, мне обычно приходится добавлять новый предохранитель в Circuit.xml.cfm либо для контроллера, либо для модели, либо для представления, либо для всего. Чтобы включить эти новые функции/страницы, я перехожу по следующему URL-адресу:

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

Последний параметр я недавно обнаружил и решил, что его использование активирует мои новые предохранители; без него новые предохранители не распознаются. Однако, когда я это делаю, все мои файлы синтаксического анализа, которые были сгенерированы ранее, удаляются. Это не большая проблема, так как они регенерируются на лету, когда они нужны в первый раз, но у меня есть некоторые страницы, которые возвращают ошибки при доступе к ним. Ошибка говорит, что каталог не найден, но они там есть, каждый раз это происходит потому, что файл синтаксического анализа не существует.

Вот пример одной ошибки с трассировкой стека:

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)

Чтобы решить эту проблему, я перехожу по следующему URL-адресу, который похож на предыдущий, но без fusebox.loadclean=true:

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

То, что я пытался сделать, было после перехода к первому URL-адресу, я бы пошел по этому второму, но ошибка все еще возникает.

Я ищу правильный способ перезагрузить схемы без появления этих ошибок. Я третий разработчик, участвующий в этом сайте, так что у двух предыдущих, возможно, были разные стили настройки каждого экземпляра Circuit.xml.cfm. Эти файлы используются для определения потока приложений, необходимых для включения, дополнительных уровней безопасности и определения определенных атрибутов. Вот метод 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>

Вот смесь методов Fusebox и 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">

Оба метода используются на сайте, и я не возражаю против использования любого из них, но моя цель — уменьшить количество ошибок, которые могут возникнуть, когда пользователь пытается получить доступ к определенной странице. Я думал, что, возможно, проблема в смешанном методе конфигураций, что я должен придерживаться, скажем, только метода Fusebox, но я не смог найти общую тенденцию в этой ошибке. Обработчик ошибок, который у нас есть, отправляет мне электронное письмо каждый раз, когда страница получает ошибку, поэтому я думаю, что я мог бы автоматически вызывать свой второй URL-адрес и перенаправлять их обратно на страницу, которая сгенерировала ошибку, когда возникает эта конкретная ошибка, но это потенциал для бесконечного цикла, и это не решает реальную проблему.

Я неправильно об этом говорю? Есть ли набор атрибутов, которые я могу включить в URL-адрес, который заставит сайт распознавать новые предохранители без очистки моих файлов синтаксического анализа? CF сам по себе кодить несложно, но я все еще относительно новичок в этом, так что я мог бы идти об этом в обратном направлении. Спасибо!


person Mathachew    schedule 25.04.2009    source источник


Ответы (2)


ПРИМЕЧАНИЕ. Новые предохранители не требуют перезагрузки блока предохранителей — требуется только новые фьюзы.

Я не совсем уверен, что ошибки, которые вы получаете, - это то, что я думаю, но следующая хорошая практика, независимо от...

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

  1. Deploy the latest code to a pre-Live 'staging' area on the same server.
    • Generate your parsed files in this area using fusebox.parseall=true and fusebox.loadclean=true
    • Скопируйте все файлы оттуда в ваш Live webroot.
    • Выполнить блокировку предохранителей fusebox.load=true на Live сайте - больше ничего (кроме пароля).

(Примечание: при необходимости перед шагом 3 переведите свой сайт в автономный режим/режим обслуживания, а затем после шага 4 снова верните его в онлайн)

person Peter Boughton    schedule 25.04.2009
comment
Это именно то, что я ищу. Перемещение моих файлов синтаксического анализа с моего промежуточного сайта на живой сайт — отличная идея. Изменения, которые я вношу в fusionactions на промежуточном сайте, требуют от меня использования пункта № 2, но как быть, когда я загружаю изменения на работающий сайт? Просто запустите fusebox.load? - person Mathachew; 28.04.2009
comment
После загрузки проанализированных файлов я имею в виду. - person Mathachew; 28.04.2009
comment
Не путайте промежуточную область с промежуточной площадкой (т. е. тестирование/UAT). У вас должна быть область на рабочем сервере, но за пределами основного веб-сайта, где вы можете создавать проанализированные файлы, копировать все измененные файлы из этой области в сетевой каталог, а затем только блок предохранителей. нагрузка необходима на живом сайте. Ваш промежуточный/тестовый/UAT-сервер не участвует в этом процессе. - person Peter Boughton; 28.04.2009
comment
Извините, но я все еще немного не понимаю различий. Я не привык к staging area и staging site (терминология и понимание приложения), просто live и dev (или sandbox) сайт. Живой сайт и песочница находятся на одном компьютере, но в разных папках, поэтому то, что вы описали, — это то, что произойдет, когда я буду готов внести свои изменения в жизнь. Еще раз спасибо. - person Mathachew; 29.04.2009
comment
Хм... далеко не идеально, но на данный момент вы, вероятно, могли бы относиться к шагу 1 и 2 как к dev/sandbox, шагу 4 как к живому сайту, а шагу 3 - к переносу между ними (после установки режима = производство) - однако, как я уже сказал, это не самый лучший способ делать вещи, поэтому я напишу о рекомендуемом способе для всего этого, но у меня впереди несколько дней, поэтому мне потребуется некоторое время, чтобы получить запись завершена. - person Peter Boughton; 29.04.2009
comment
Я никогда не менял режим песочницы, когда взялся за этот проект несколько месяцев назад, поэтому он также работает в рабочем режиме. В обстоятельствах, в которых я взялся за этот проект, у меня не было времени разбираться в таких вещах. Даже в качестве общей практики я никогда не рассматривал это, но, безусловно, я открыт для этого, если это означает, что я стану лучшим разработчиком. Писать что-то необязательно, но если вы готовы выполнить эту задачу, то по крайней мере один человек будет вам признателен. - person Mathachew; 29.04.2009
comment
Что ж, это одна из многих вещей, которые я давно собирался написать — вы просто дали мне повод сделать это. :) - person Peter Boughton; 30.04.2009

Есть ли причина не использовать fusebox.mode = "development-full-load" (установлено в fusebox.xml)? Это может немного облегчить вам жизнь, если вы еще не работаете в этом режиме.

person Sergey Galashyn    schedule 26.04.2009
comment
Поскольку он говорит о пользователях, подключающихся к сайту, он либо работает, либо тестирует, а не разрабатывает, поэтому следует использовать режим = производство. - person Peter Boughton; 27.04.2009