Как перезапустить Coldfusion Application Server, когда время ожидания истекло? - PullRequest
1 голос
/ 17 февраля 2011

Есть ли способ перезапустить сервер CF через Application.cfc, когда время ожидания приложения истекло?Согласно документации Adobe, они показали следующее:

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

Я хотел бы заменить <cflog> выше на <cfexecute> следующим образом:

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

Итак1009 * запустит файл CFRestart.bat по истечении времени ожидания приложения.Это возможно или нет?

Ответы [ 6 ]

4 голосов
/ 17 февраля 2011

onApplicationEnd = вряд ли будет достигнуто , если у вас нет очень тихого приложения, потому что каждый раз, когда кто-то обращается к приложению, время ожидания сбрасывается.

Мне было бы очень неудобно использовать приложение для перезапуска экземпляра Coldfusion.Я вижу все виды ужасных проблем безопасности и т.д.Честно говоря, я не совсем уверен, почему вы хотите перезагрузить сервер, если ваше приложение заканчивается.

Кроме того, в соответствии с документацией onApplicationEnd вызывается при перезапуске сервера, поэтому, если вы все же заработали, при перезапуске сервера приложение также может перезапустить сервер.Это было бы очень грязно.

3 голосов
/ 17 февраля 2011

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

1 голос
/ 28 февраля 2011

Это может быть не ваш ответ, но я часто использую это, чтобы помочь в сборке мусора в памяти 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>
0 голосов
/ 28 апреля 2015

Чтобы добавить к ответу Стивена Моретти и, возможно, вы нашли возможное решение интересующего вас вопроса:

Будет ли OnApplicationEnd запускать BAT-файл CFRestart, когда приложение тайм-аут?

Прямой ответ - нет. Так как событие OnApplicationEnd() является частью жизненного цикла приложения, поэтому, когда время самого приложения истекло, событие не будет вызываться здесь. Это должно быть ясно.

Если перейти прямо к вашему вопросу, то да, вы можете настроить собственный файл сценария на случай тайм-аута или завершения приложения (в любом случае). Вам придется иметь дело с Serve Scope здесь.

0 голосов
/ 26 августа 2011

Это долго зависало без ответа, поэтому я подумал, что помогу разобраться с этим.

Во-первых, это: «Ошибка сервера Сервер обнаружил внутреннюю ошибку и не смог завершитьзапрос. Не удалось подключиться к JRun Server. "

Это не тайм-аут приложения, это просто сервер перестает отвечать на запросы, или не хватает памяти, или просто сталкивается с чем-то, что ему не нравится.Но это никак не связано с истечением времени ожидания приложения.

Время ожидания приложения истекло, если на этом сайте не было никаких действий (т. Е. Нет запросов на страницы ... нет посетителей ) дольше, чемпериод ожидания приложения, который по умолчанию составляет два дня (или то, что вы установили в своем Application.cfc).

Теперь ... Я могу понять, почему вы можете захотеть восстановиться, если ваш сервер перестает отвечать, новы подходите к этому с неправильной точки зрения.По сути, если сервер не работает, вы не можете использовать этот сервер, чтобы сделать что-либо (например, вылечить себя)!Как правило, здесь делается то, что какой-то другой процесс проверяет, что сервер реагирует, и, если эта служба определяет, что сервер не отвечает, выдает перезагрузку.

Так что вы должны взглянуть на некоторыедругое программное обеспечение, которое может выполнить HTTP-запрос к вашему CF-серверу, и если реакция на HTTP-запрос предполагает, что CF-сервер не отвечает, тогда программное обеспечение для мониторинга сообщает CF о перезапуске.

0 голосов
/ 17 февраля 2011

Во-первых, приложение не выполняет тайм-аут, запрос страницы выполняется. По таймауту запроса функция onApplicationEnd () вызывается , а не . Это вызывается только если приложение закрывается. Вот некоторая информация о жизненном цикле приложения CF.

Во-вторых, по моему опыту, перезапуск серверов приложений по любой причине, вероятно, маскирует вашу реальную проблему. Если ваше приложение работает медленно / сбои и т. Д., Тогда я предлагаю вам рассмотреть настоящую причину, по которой это происходит, а не перезапускать ее.

Однако я не могу придумать причину, по которой это не сработает в принципе, но я бы посоветовал вам провести быстрый тест, если это действительно то, что вы хотите сделать.

Надеюсь, это поможет.

...