onApplicationStartを介してアプリケーションをリセットし、クラスター内のすべてのサーバーでアプリケーションが再起動されていることを確認する方法はありますか?
たとえば、現在のコードでは、DSNがリクエストに設定されています。アプリケーションスコープにプッシュしたいのですが、変更が必要な場合は、CFサービスを開始および停止せずに、クラスター内のすべてのサーバーに確実に伝達されるようにしたいと思います。
onApplicationStartを介してアプリケーションをリセットし、クラスター内のすべてのサーバーでアプリケーションが再起動されていることを確認する方法はありますか?
たとえば、現在のコードでは、DSNがリクエストに設定されています。アプリケーションスコープにプッシュしたいのですが、変更が必要な場合は、CFサービスを開始および停止せずに、クラスター内のすべてのサーバーに確実に伝達されるようにしたいと思います。
1つの提案は、各サーバーが読み取ることができる日付スタンプ付きのファイルをプロジェクトに含めることです。
CFを取得して、起動時にアプリケーションに日付を保存し、各onRequestStart()でそのファイルと比較します。
日付が変更された場合、CFはそのサーバーのonApplicationStart()を実行します。
この手法をANTスクリプトで使用しているため、各サーバーにANTタイムスタンプをデプロイすると、ファイルにタイムスタンプが付けられ、次にアプリケーションにアクセスした人がアプリケーションをリセットします。
乾杯、ジェームズ
URL変数を介してスコープをリセットするようにアプリケーションを設定しています。したがって、次のようなコードを使用して、管理者のページからhttp経由でクラスター内のすべてのサーバー上のアプリケーションを再起動できます。
<cfset serverList = "Server1.domain.com,Server2.domain.com" />
<cfset threadList = "" />
<cfloop list="#serverList#" index="currentServer">
<cfset threadList = ListAppend(threadList, "thread#currentServer#") />
<cfthread
action="run"
name="thread#currentServer#"
url="http://#currentServer#?URLToResetScope"
key="#currentIndex#"
>
<cfhttp method="get" url="#Attributes.URL#" result="thread.cfhttp" />
</cfthread>
</cfloop>
<cfthread action="join" name="#threadList#" timeout="120000" />
<cfloop list="#threadList#" index="currentThread">
<cfset Results &= currenthThread & ": " & threadresult.cfhttp />
</cfloop>
私たちが行っているのは、サーバーのリストを取得し、そのリストをループして、cfthreadを使用して、各サーバーにリクエストを渡し、サーバー自体のスコープをリセットすることです。次に、これらすべてのスレッドを結合し、それらをループして各リクエストの結果を取得します。次に、これらの結果を管理者に表示して、クラスター内のすべてのサーバーが正しく更新されたことを確認できます。正しく更新されなかったサーバーがある場合は、そのサーバーを個別にリセットできます。
ダン