1

これが以前に尋ねられた場合は申し訳ありませんが、私の質問に答えることができるものは何も見つかりませんでした.

Web サイトから実行され、オフィスの外部 DSN にクエリを実行する Coldfusion スクリプトがあります。

問題は、サーバーがイギリスの田舎にあり、時々サーバーが利用できないことです (信頼できない英国の ISP のおかげです!!)

外部 dsn にクエリまたは ping を実行して、スクリプト全体を cfif ステートメントでラップし、接続に失敗した場合に電子メールを受け取ることができるコマンドが Coldfusion にありますか?

4

3 に答える 3

3

これはダンカンの回答に対するコメントの拡張ですが、コメントにコードブロックを入れることはできないため...

<cfset TargetHost = "0.0.0.0" />
<cfset PingAttempts = 4 />

<cfif find('Windows',Server.Os.Name)>
    <cfset Args = "-n #PingAttempts# #TargetHost#" />
<cfelse>
    <cfset Args = "-c #PingAttempts# #TargetHost#" />
</cfif>

<cfexecute name="ping" arguments=#Args# variable="PingResult" timeout=10 />

<cfif PingResult CONTAINS "100% packet loss"
    OR PingResult CONTAINS "100% loss"
    >
    [send alert]
</cfif>

<cfdump var=#PingResult# />

(一般的に、私は実際のクエリを介してチェックを続けます.pingはマシンがオンラインであることを確認するだけで、データベースが応答していることは確認しません。)

于 2013-08-15T13:59:27.267 に答える
2

JFGI:

<cfexecute name="C:\winnt\system32\ping.exe" arguments="#request.myIP#"  variable="myPing" timeout="8"></cfexecute> 

または Linux/Unix の場合:

<cfexecute name="ping" arguments="#request.myIP# -c 3" timeout="10" variable="myPing" />

<cfif myPing contains "Request timed out">
  <cfmail ...>
<cfelse>
  [do something else]
</cfif>

またはhttp://www.bennadel.com/blog/751-Learning-ColdFusion-8-Ping-User-Defined-Function-Inspired-By-Ray-Camden-.htm

于 2013-08-15T10:41:25.237 に答える
2

データソースが機能するかどうかを確認するには、それを使用してみてください。

<cftry>
    <cfquery datasource="external" timeout=10 >
        SELECT 1
    </cfquery>
    <cfcatch>
        <cfif [timeout error]>
            <cfmail ...>No response in 10 seconds</cfmail>
        <cfelse>
            [do something else]
        </cfif>
    </cfcatch>
</cftry>


それが機能していないように見えるため、別のオプションは次のとおりです。

<cfthread action="run" name="QueryThread">
    <cfquery datasource="external">SELECT 1</cfquery>
</cfthread>
<cfthread action="run" name="CheckThread">
    <cfthread action="sleep" duration="10000" />
    <cfif cfthread.QueryThread.Status NEQ 'COMPLETED'>
        [handle error]
        <cfthread action="terminate" name="QueryThread" />
    </cfif>
</cfthread>

同じ概念ですが、複数のスレッドを使用すると、クエリが深すぎて CF が壊れない場合でも、10 秒後にメール送信をトリガーできます。

于 2013-08-15T11:43:38.753 に答える