1

アプリケーションがタイムアウトしたときに、Application.cfcを介してCFサーバーを再起動する方法はありますか?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>

したがって、アプリケーションがタイムアウトしたときにファイルOnApplicationEndを実行します。CFRestart.batこれは可能ですか?

4

6 に答える 6

4

誰かがアプリケーションにアクセスするたびにタイムアウトがリセットされるため、非常に静かなアプリケーションがない限り、 onApplicationEndに到達する可能性は低くなります。

アプリケーションを使用してColdFusionインスタンスを再起動するのは非常に不快です。あらゆる種類の恐ろしいセキュリティ問題などが迫っています。正直なところ、アプリケーションが終了した場合にサーバーを再起動する理由がよくわかりません。

また、ドキュメントによると、サーバーの再起動時にonApplicationEndが呼び出されるため、これが機能するようになった場合、サーバーを再起動すると、アプリケーションはサーバーの再起動も実行します。これは非常に厄介になります。

于 2011-02-17T10:22:53.593 に答える
4

.batスクリプトをColdFusionから呼び出すことができるとは思わないでください。サービスを停止すると、<cfexecute>も終了するため(CFサービスで実行されていると考えてください)、再起動には至りません。

メモリ不足(OOM)例外が発生しているために、サーバーに定期的に障害が発生していると推測します。このような状況でのこぶを乗り越えるために、サーバーを定期的に、たとえば24時間、12時間、または6時間ごとに再起動するWindowsスケジュールタスク(方法については最初の回答を参照)としてバッチスクリプトとして設定します。状況に適した間隔を選択してください。

OOMが根本的な原因であると想定して、Java JDKをダウンロードし、それを使用するようにColdFusionを構成し(つまり、jvm.configファイルのjvmhome)、パラメーターを渡してJMX接続を有効にすることをお勧めします。このJMX接続を使用して、JDKに付属のVisualVMを使用してColdFusionを監視します。そこから、ヒープダンプファイルを生成したり、VMにOOMで生成するように指示したりできます。Tehn私はEclipseMemoryAnalyzer Toolを介してそれを実行することに非常に成功しました。これは、サーバーOOMのクラッシュの根本原因を追跡するのに複数回役立ったというリークの疑いのあるレポートを持っています。

それがシナリオではない場合は、ColdFusion Enterpriseを使用している場合はスナップショットを有効にすることをお勧めします。そうでない場合は、cfstatが標準の友だちです。どちらの場合も、サーバーの実行速度が遅いときに通知を送信するプローブを設定することもできます。これは、問題のサーバーに接続して適切なタイミングでダンプを生成したり、問題が負荷に関連しているかどうかを特定したりするのに役立ちます。

于 2011-02-17T11:45:44.360 に答える
1

これはあなたの答えではないかもしれませんが、私はこれを頻繁に使用して、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>
于 2011-02-28T17:08:00.447 に答える
0

これは何年もの間無回答でぶらぶらしていたので、私はそれを片付けるのを手伝うと思いました。

まず、「サーバーエラーサーバーで内部エラーが発生し、リクエストを完了できませんでした。JRunサーバーに接続できませんでした。」

これはアプリケーションのタイムアウトではありません。サーバーが応答しなくなったり、メモリが不足したり、気に入らない問題が発生したりするだけです。ただし、アプリケーションのタイムアウトとは関係ありません。

アプリケーションのタイムアウト期間(デフォルトでは2日(またはApplication.cfcで設定したもの))よりも長い間、そのサイトでアクティビティがない(つまり、ページ要求がない...訪問者がいない)と、アプリケーションがタイムアウトします。 。

さて...サーバーが応答しなくなった場合に回復したい理由がわかります。間違った角度からこれに近づいています。本質的に、サーバーが機能していない場合、そのサーバーを使用して何かを行うことはできません(それ自体を修復するなど)。ここで一般的に行われることは、他のプロセスがサーバーが応答していることを確認し、そのサービスがサーバーが応答していないと判断した場合、再起動を発行することです。

したがって、CFサーバーへのHTTPリクエストを実行できる他のソフトウェアを確認する必要があります。HTTPリクエストへの応答でCFサーバーが応答しないことが示唆された場合、監視ソフトウェアはCFに再起動を指示します。

于 2011-08-26T06:41:14.433 に答える
0

スティーブンモレッティによる答えに追加するには、上記の興味深い質問にあなたが探していた可能な解決策かもしれません:

アプリケーションがタイムアウトしたときに、OnApplicationEndはCFRestart BATファイルを実行しますか?

正解はノーです。イベントはアプリケーションのライフサイクルの一部であるためOnApplicationEnd()、アプリケーション自体がタイムアウトした場合、ここで呼び出されるイベントはありません。これは明確でなければなりません。

ただし、質問に直接答えると、はい、アプリケーションのタイムアウトまたは終了のイベントでカスタムスクリプトファイルを実行することができます(いずれの場合でも)。ここで対処する必要がありServe Scopeます。

于 2015-04-28T08:57:44.467 に答える
-1

まず、アプリケーションはタイムアウトしませんが、ページリクエストはタイムアウトします。リクエストのタイムアウト時に、onApplicationEnd()関数は呼び出されません。これは、アプリケーションがシャットダウンしている場合にのみ呼び出されます。CFアプリケーションのライフサイクルに関する情報を以下に示します。

第二に、私の経験では、何らかの理由でアプリケーションサーバーを再起動すると、おそらく実際の問題が隠されます。アプリケーションの実行速度が遅い/クラッシュするなどの場合は、再起動するのではなく、これが発生している本当の理由を調べることをお勧めます

ただし、これが原則として機能しない理由は考えられませんが、これが本当にやりたいことである場合は、簡単なテストを行うことをお勧めします。

お役に立てば幸いです。

于 2011-02-17T10:06:40.200 に答える