Couchbaseと対話する最もシンプルなJavaプログラムはどのようなもので、それをJavaコマンドラインツールを利用してどのようにコンパイルして実行するのでしょうか。ご興味があれば、リスト1の手順を参照してください。
リスト1: Main.java
import java.net.URI; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; import com.couchbase.client.CouchbaseClient; import net.spy.memcached.internal.GetFuture; import net.spy.memcached.internal.OperationFuture; public class Main { public static final int EXP_TIME = 10; public static final String KEY = "spoon"; public static final String VALUE = "Hello World!"; public static void main(String args[]) { // URIをセットしてクライアントを取得 List<URI> uris = new LinkedList<URI>(); Boolean do_delete = false; // 適切なURLを指定してローカルホストへ接続 uris.add(URI.create("http://127.0.0.1:8091/pools")); CouchbaseClient client = null; try { client = new CouchbaseClient(uris, "default", ""); } catch (Exception e) { System.err.println("Error connecting to Couchbase: " + e.getMessage()); System.exit(0); } // 同期のgetを実行 Object getObject = client.get(KEY); // 非同期のsetを実行 OperationFuture<Boolean> setOp = client.set(KEY, EXP_TIME, VALUE); // 非同期のgetを実行 GetFuture getOp = client.asyncGet(KEY); // 非同期のdeleteを実行 OperationFuture<Boolean> delOp = null; if (do_delete) { delOp = client.delete(KEY); } // クライアントをシャットダウン client.shutdown(3, TimeUnit.SECONDS); // データに何が起こったか見てみましょう // setオペレーションは成功したでしょうか try { if (setOp.get().booleanValue()) { System.out.println("Set Succeeded"); } else { System.err.println("Set failed: " + setOp.getStatus().getMessage()); } } catch (Exception e) { System.err.println("Exception while doing set: " + e.getMessage()); } // 同期のgetで取得した値を出力 if (getObject != null) { System.out.println("Synchronous Get Suceeded: " + (String) getObject); } else { System.err.println("Synchronous Get failed"); } // 非同期のasyncGetで取得した値を出力 try { if ((getObject = getOp.get()) != null) { System.out.println("Asynchronous Get Succeeded: " + getObject); } else { System.err.println("Asynchronous Get failed: " + getOp.getStatus().getMessage()); } } catch (Exception e) { System.err.println("Exception while doing Aynchronous Get: " + e.getMessage()); } // deleteが成功したか確認します if (do_delete) { try { if (delOp.get().booleanValue()) { System.out.println("Delete Succeeded"); } else { System.err.println("Delete failed: " + delOp.getStatus().getMessage()); } } catch (Exception e) { System.err.println("Exception while doing delete: " + e.getMessage()); } } } }
Main.javaという名前のファイルにリスト1のコードを入力します。
Java用のcouchbase-clientとspymemcachedクライアントライブラリをダウンロードしてください。下記の実行手順に記載されているとおり、依存するJARファイルも必要になります。依存するJARを取得する簡単な方法の一つはMavenリポジトリを利用することです。
次のコマンドを入力します。
$ javac -cp couchbase-client-1.0.0.jar:spymemcached-2.8.0.jar \ Main.java $ java -cp .:couchbase-client-1.0.0.jar:spymemcached-2.8.0.jar:\ jettison-1.1.jar:netty-3.2.0.Final.jar:commons-codec-1.5.jar Main
お使いのCouchbaseサーバのIPアドレスに置き換えてください。LinuxやMacOSを利用している場合、2つめのコマンドラインのセミコロンをコロンに置き換えてください。実行すると次の情報が出力されます:
2012-01-16 15:06:29.265 INFO com.couchbase.client.CouchbaseConnection: Added {QA sa=/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue 2012-01-16 15:06:29.277 INFO com.couchbase.client.CouchbaseConnection: Connection state changed for sun.nio.ch.SelectionKeyImpl@1d3c468a 2012-01-16 15:06:29.420 INFO com.couchbase.client.CouchbaseConnection: Shut down Couchbase client Synchronous Get failed Set Succeeded Asynchronous Get Succeeded: Hello World!
この出力のほとんどは、問題を診断するためにクライアントライブラリ内で何が起こっているのか伝えるために、クライアントライブラリが状態をログに出力しているものです。Couchbaseへの接続が追加され、接続状態が変化したことを表示しています。そして、同期のgetが失敗したことを示しています。これは"spoon"というキーがCouchbase内に存在しなかったことが原因です。
10秒以内に、再度プログラムを実行すると、次の出力が生成されます:
2012-01-16 15:37:12.242 INFO com.couchbase.client.CouchbaseConnection: Added {QA sa=/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue 2012-01-16 15:37:12.253 INFO com.couchbase.client.CouchbaseConnection: Connection state changed for sun.nio.ch.SelectionKeyImpl@7f2ad19e 2012-01-16 15:37:12.439 INFO com.couchbase.client.CouchbaseConnection: Shut down Couchbase client Synchronous Get Succeeded: Hello World! Set Succeeded Asynchronous Get Succeeded: Hello World!
再度ログの内容を見てみると、接続状態に関する出力の次に、"spoon"というキーがCouchbaseに存在し、その値が"Hello
World!"だったことが分かります。これは同期のgetが成功した証拠です。10秒後に同じプログラムを実行するか、do_deleteフラグをtrueにして、プログラムの動作の変化を見てみましょう。getOp.getStatus().getMessage()
の様に、Operationクラスのメソッドを呼び出せば、障害が発生した際にサーバから正確なメッセージを取得することができます。
おめでとうございます、より広い世界に向けて、最初の小さな一歩を踏み出しました。