RMI とJNDI との連携を試してみたいが、その前に 普通の Serializeable なオブジェクトを JNDI に登録する方法を確認したい。以下、JNDI を使って、HashMap
オブジェクトを LDAP コンテキストに登録した記録。
(Cygwin の OpenLDAP を動かすやり方と、ここで使っている LDAP設定は前ポスト参照)
以下の試行では、Eclipse 3.5 Galileo から JUnit 4を使って、@Test メソッドを個別に実行する方法でやってみた。(@Test メソッドごとに実行するやり方は、Eclipse の Outline ビューでメソッドを選択して、コンテキストメニューから [Run As]/ [JUnit Test]。)
コードは以下のようなものを用いた。
import ・・・略
public class App {
private static Context ctx = null;
@BeforeClass
public static void connect() throws Exception {
Hashtable<String, String> env = new Hashtable<String, String>(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITest,dc=example,dc=com");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=example,dc=com");
env.put(Context.SECURITY_CREDENTIALS, "secret");
ctx = new InitialContext(env);
}
@AfterClass
public static void closeContext() throws Exception {
if (null != ctx) ctx.close();
}
@Test
public void bind() throws Exception {
Map<String, String> map = new HashMap<String, String>();
map.put("keyA", "valueA");
ctx.bind("cn=map", map);
}
@SuppressWarnings("unchecked")
@Test
public void lookup() throws Exception {
Map<String, String> map = (Map<String, String>) ctx.lookup("cn=map");
assertEquals("valueA", map.get("keyA"));
}
@Test
public void unbind() throws Exception {
ctx.unbind("cn=map");
}
}
これを以下の手順で動かして、どうなるか観察する。- まず lookup() を実行する。未登録なので NamingException が発生する事を確認
- 次に bind() を実行し、例外が出ない事を確認。また実際に o=JNDITest の下に cn=map エントリが作られている事を、LDAP Admin で確認
- 再び lookup() を実行し、今度は例外も無く assertEquals が成功する事を確認
- 最後に unbind() を実行。例外無く終了し、LDAP Admin でみると cn=map エントリが消えている事を確認
これで RMI とJNDI の組み合わせを試す準備ができた。
0 件のコメント:
コメントを投稿