IBM Bluemix では様々な API がサービスとして提供されていますが、その中の1つでメモリキャッシュの機能を提供する Memcached Cloud があります:
2016051501


同サービスは IBM のビジネスパートナーである Redis Labs から提供されているものです。同社からは他にも Redis のサービスである Redis Cloud も提供されています。

この Memcached Cloud サービスを使ってみようと試みた時に、自分が躓いた点がありました。これまで自分が memcached を使う時はユーザーやパスワードの認証を使ったことがなく、そのため認証を前提としない JAR ライブラリを用意して使っていたのですが、Memcached Cloud ではユーザー&パスワードの認証が必要になります。というわけで、認証に対応したライブラリを用意する必要がありました。その手順を見つけるのに苦労したり、ドキュメントに書かれている通りには動かなかったりしたので、備忘録として手順をここに記録しておくことにします。


まず、認証に対応した Java の Memcached ライブラリとしては spymemcached を使うことにします:
2016051502


spymemcached は上記のように github からソースコードが提供されています。どこかからバイナリを探してダウンロードしてもいいのですが、自分は(最新版で試したいという意味もあったので)このソースからビルドしました。

ビルドの手順はこんな感じです。Linux(自分の場合は CentOS 6)のコマンドラインから以下のように入力して、ソースコードをダウンロードし、ant でビルドしました:
# cd /usr/local/src
# git clone https://github.com/dustin/java-memcached-client
# cd java-memcached-client
# ant

ant のビルドが成功すると、build/jars 以下に spymemcached のバイナリ jar ファイルが作られます(この例ではバージョンは 2.11.4 です。以下のコードはこのバージョンでの動作を確認しています。またファイル名に test が付いている方はこの後では不要です)。このファイルを使って Java のコードを記述します:
# cd build/jars
# ls
spymemcached-2.11.4.jar  spymemcached-test-2.11.4.jar

実際の Java コードはこのような感じになります。例えば memcached クライアントである MemcachedClient インスタンスを取得するには以下のように記述します(赤字の部分がユーザー名、パスワード、サーバー名です):
  :
  :
import net.spy.memcached.*;
import net.spy.memcached.auth.*;
  :
  :

  MemcachedClient mc = null;
		
  try{
    PlainCallbackHandler ph = new PlainCallbackHandler( "username", "password" );
    AuthDescriptor ad = new AuthDescriptor( new String[] { "PLAIN" }, ph );
    mc = new MemcachedClient(
      new ConnectionFactoryBuilder()
        .setProtocol(ConnectionFactoryBuilder.Protocol.BINARY)
        .setAuthDescriptor( ad ).build(),
      AddrUtil.getAddresses( "server.test.com:19606" ) );
    if( mc != null ){
      :
      :
    }
  }catch( Exception e ){
    e.printStackTrace();
  }

ドキュメントとの差異としては、AuthDescriptor のコンストラクタへ渡す第一引数の型は String ではなく String 配列にする必要があるようです。というわけで上記青字のような感じにしました。