2

次の Clojure コードを使用して.pingriak-java-clientからラップします。しかし、私は例外をキャッチすることでこの率直になるのは好きではありません:

(ns myapp.riak
  (:import [com.basho.riak.client IRiakClient]))

(set! *warn-on-reflection* true)

(defn alive?
  "Is Riak client alive? Returns true or false, unlike `.ping`."
  [^IRiakClient client]
  (try
    (.ping client) true
    (catch Exception e false)))

私はこれらをキャッチしようとしました:

  • com.basho.riak.client.RiakException
  • java.net.ConnectException
  • java.io.IOException

しかし、これらのどれも (単独または組み合わせて) 機能しませんでした。

私は何を間違っていますか?

午後 3:56 EDT 更新:RiakFactory/httpClient重要な場合に備えて を使用しています。

午後 4 時 13 分 EDT 更新: 興味深い側面の 1 つは、デバッグ プロセスです。デバッグ中ConnectExceptionに、REPL に表示されました。しかしRiakIORuntimeException-- 以下のソリューションの一部 -- は表示されませんでした。なぜだろう。

4

1 に答える 1

2

ping は RiakException をスローします - https://github.com/basho/riak-java-client/blob/master/src/main/java/com/basho/riak/client/DefaultRiakClient.java#L210

次の機能は私にとってはうまくいきます。riak がインストールされていないため、falseが返されます

(ns riak.core
  (:import [com.basho.riak.client IRiakClient RiakFactory RiakException]
           [com.basho.riak.client.http.response RiakIORuntimeException]))

(set! *warn-on-reflection* true)
;; (def client (RiakFactory/pbcClient))
(def client (RiakFactory/httpClient))

(defn alive?
  "Is Riak client alive? Returns true or false, unlike `.ping`."
  [^IRiakClient client]
  (try
    (.ping client)
    true
    (catch RiakException e false)
    (catch RiakIORuntimeException e false)))

交換:

riak.core> (alive? client)
false

更新: httpClient の RiakIORuntimeException ケースを追加しました

于 2013-07-07T19:53:26.650 に答える