3

監視システムの場合、ブール式で表されるカスタム チェックを評価する必要があります。たとえば、単純な疑似コード条件があります (より複雑になる可能性があります)。

if (webservice is unavailable) and (there are no emails about planned downtime)

可能であれば、ここで短絡評価を使用したいと思います。これにより、Web サービスが利用可能である (そして最初の条件が であるfalse) 場合、2 番目の部分は評価されませfalseん。これにより、不要なメール サーバーへの接続 (およびその他の時間のかかる操作) を回避できます。

これが私が達成しようとしているものの例です:

class WebserviceDownCheck {
  boolean check() { 
    println 'Checking webservice'
    return false 
  }
}

class NoDowntimeEmailCheck {
  boolean check() { //shouldn't be executed
    println 'Checking emails'
    return true 
  }
}
//using string evaluation, because conditions are constructed during runtime
Eval.me("${new WebserviceDownCheck().check()} && ${new NoDowntimeEmailCheck().check()}")

出力は次のとおりです。

Checking webservice
Checking emails //shouldn't be there
Result: false

NoDowntimeEmailCheck().check()最初の条件はすでに であるため、実行しないでくださいfalse。私はもう試した:

  • GroovyShellの代わりに使用Eval
  • check()フィールドへのメソッドの変更と@Lazy変換の適用
  • ${new WebserviceDownCheck().check()}への変更(ここで${ -> new WebserviceDownCheck().check()}見た)

(または) が既に実行されているGString間に初期化できるようにする遅延メカニズムが必要なようです。怠け者のようなものかもしれません。EvalGroovyShellBindingGroovyShell

カスタムの文字列評価ロジックを書かなくてもなんとかなるのだろうか?

4

1 に答える 1

3

次のように、1 つの式に結合します。

Eval.me("${new WebserviceDownCheck().check() && new NoDowntimeEmailCheck().check()}")

結果が false の場合、最初のものだけが評価されます。

于 2014-06-23T18:57:17.507 に答える