Как перезапустить Coldfusion Application Server, когда время ожидания истекло?
Есть ли способ перезапустить CF-сервер приложением, если время ожидания истекло? Согласно документации Adobe, они показали следующее
<cffunction name="onApplicationEnd">
<cfargument name="ApplicationScope" required=true/>
<cflog file="#This.Name#" type="Information"
text="Application #Arguments.ApplicationScope.applicationname# Ended" >
</cffunction>
Что я хочу сделать, я хочу заменить вместо того, чтобы следовать
<cfexecute name = "C:\CFRestart.bat"
outputFile = "C:\output.txt"
timeout = "1">
</cfexecute>
Моя точка зрения будет OnApplicationEnd будет запускать BAT-файл CFRestart, когда приложение истекло. Пожалуйста, предложите это возможно или нет?
6 ответов
onApplicationEnd вряд ли будет достигнут, если у вас нет очень тихого приложения, потому что каждый раз, когда кто-то обращается к приложению, время ожидания сбрасывается.
Мне было бы очень неудобно использовать приложение для перезапуска экземпляра Coldfusion. Я вижу все виды ужасных проблем безопасности и т.д. Честно говоря, я не совсем уверен, почему вы хотите перезагрузить сервер, если ваше приложение заканчивается.
Кроме того, в соответствии с документацией onApplicationEnd вызывается при перезапуске сервера, поэтому, если вы все же заработали, при перезапуске сервера приложение также может перезапустить ваш сервер. Это было бы очень грязно.
Не верьте, что вы можете вызвать скрипт.bat из ColdFusion. Потому что, как только он останавливает службу <cfexecute>
также будет завершен (думаю, что он работает в рамках службы CF), никогда не достигнув перезапуска.
Предполагается, что у вас есть сервер, который обычно выходит из строя, потому что вы используете исключение "Недостаточно памяти" (OOM). Чтобы преодолеть препятствия в таких ситуациях, я настроил пакетный скрипт как запланированное задание Windows (см. Первый ответ там), который периодически перезагружает сервер, скажем каждые 24, 12 или 6 часов. Выберите интервал, который имеет смысл для вашей ситуации.
Предполагая, что OOM является основной причиной, я предлагаю загрузить Java JDK, сконфигурировать ColdFusion для его использования (т.е. jvmhome в файле jvm.config) и передать параметры для включения соединения JMX. Это соединение JMX используется для мониторинга ColdFusion с помощью Visual VM, которая поставляется с JDK. Оттуда вы можете сгенерировать файл дампа кучи и / или указать виртуальной машине сгенерировать его в OOM. Таким образом, я добился очень хороших успехов, выполняя это с помощью Eclipse Memory Analyzer Tool, который имеет сообщение о подозрительных утечках, которое не раз помогало отследить основную причину сбоев OOM сервера.
Если это не ваш сценарий, то я предлагаю включить снимки, если вы используете ColdFusion Enterprise, в противном случае cfstat - ваш друг по стандарту. Для любого из них вы также можете настроить зонды, которые отправляют уведомление, когда сервер работает медленно. Это может помочь вам подключиться к рассматриваемому серверу и сгенерировать дамп в соответствующее время или определить, связана ли проблема с нагрузкой.
Это может быть не ваш ответ, но я часто использую это, чтобы помочь в сборке мусора в памяти JVM.
Установите это как запланированное задание для запуска каждые 5 минут, и у меня больше не будет проблем с памятью jvm.
<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>
Чтобы добавить ответ Stephen Moretti и, возможно, вы нашли возможное решение интересующего вас вопроса:
Будет ли OnApplicationEnd запускать BAT-файл CFRestart по истечении времени ожидания приложения?
Прямой ответ - нет. Так как OnApplicationEnd()
Событие является частью жизненного цикла приложения, поэтому, когда время самого приложения истекло, событие не будет вызываться здесь. Это должно быть ясно.
Если перейти непосредственно к вашему вопросу, то да, вы можете настроить собственный файл сценария на случай тайм-аута или завершения приложения (в любом случае). Вам придется иметь дело с Serve Scope
Вот.
Это болталось без ответа целую вечность, поэтому я подумал, что помогу разобраться с этим.
Во-первых, это: "Ошибка сервера. Сервер обнаружил внутреннюю ошибку и не смог выполнить ваш запрос. Не удалось подключиться к JRun Server".
Это не тайм-аут приложения, это просто сервер перестает отвечать на запросы или не хватает памяти, или просто сталкивается с чем-то, что ему не нравится. Но это никак не связано с тайм-аутом приложения.
Время ожидания приложения истекло, если на этом сайте не было никаких действий (т. Е. Запросов на страницу... посетителей нет) дольше, чем время ожидания приложения, которое по умолчанию составляет два дня (или что-то, что вы указали в Application.cfc).,
Теперь... я могу понять, почему вы можете захотеть восстановиться, если ваш сервер перестает отвечать на запросы, но вы подходите к этому с неправильной стороны. По сути, если сервер не работает, вы не можете использовать этот сервер, чтобы сделать что-либо (например, вылечить себя)! Обычно здесь делается то, что какой-то другой процесс проверяет, что сервер реагирует, и если эта служба определяет, что сервер не отвечает, выдает перезагрузку.
Поэтому вам следует взглянуть на какое-то другое программное обеспечение, которое может выполнить HTTP-запрос к вашему CF-серверу, и если реакция на HTTP-запрос предполагает, что CF-сервер не отвечает, тогда программное обеспечение для мониторинга сообщает CF о перезагрузке.
Во-первых, приложение не выполняет тайм-аут, запрос страницы. По тайм-ауту запроса функция onApplicationEnd() не вызывается. Это вызывается только если приложение закрывается. Вот некоторая информация о жизненном цикле приложения CF.
Во-вторых, по моему опыту, перезапуск серверов приложений по любой причине, вероятно, маскирует вашу реальную проблему. Если ваше приложение работает медленно / сбои и т. Д., То я предлагаю вам изучить реальную причину этого, а не перезапускать его.
Однако я не могу придумать причину, по которой это не сработает в принципе, но я бы посоветовал вам провести быстрый тест, если это действительно то, что вы хотите сделать.
Надеюсь, это поможет.