Glassfish Remote EJB from stand-alone client

サーバで設定したデータソースをローカルアプリで使いたいんだけど、Contextの設定はどうすんだろと調べてみた。
行き着いたのはGlassfishのFAQページ。→glassfish: EJB FAQ
日本語の記事とかぜんぜんないのね。

テストクライアントアプリを作ってみる。

データソースははじめからついてるDerbyPoolを利用。
(JNDI名はjdbc/__default)
クラスパスに以下のJarを追加。

  • AS_HOME/lib/appserv-admin.jar
  • AS_HOME/lib/appserv-rt.jar
  • AS_HOME/lib/javaee.jar
  • AS_HOME/lib/install/applications/jmsra/imqjmsra.jar
  • AS_HOME/javadb/lib/derbyclient.jar

以下ソース

public class Client {
    public static void main(String[] args) {
        try {
            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(InitialContext.INITIAL_CONTEXT_FACTORY, 
                    "com.sun.enterprise.naming.SerialInitContextFactory");
            env.put(InitialContext.URL_PKG_PREFIXES, 
                    "com.sun.enterprise.naming");
            env.put(InitialContext.STATE_FACTORIES, 
                    "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
            
            env.put("org.omg.CORBA.ORBInitialHost", "localhost");
            env.put("org.omg.CORBA.ORBInitialPort", "3700");
            
            InitialContext ctx = new InitialContext(env);
            DataSource ds = (DataSource) ctx.lookup("jdbc/__default");
            
            Connection connection = ds.getConnection();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        System.exit(0);
    }

}

これで完成。


ちなみに、「INITIAL_CONTEXT_FACT」「URL_PKG_PREFIXES」「STATE_FACTORIES」の設定はappsesrv-rt.jarの中にjndi.propertiesが格納されてるのでぶっちゃけ不要w
リモートの鯖に接続する場合にHostとPortを指定するだけでOK。


でもいまってDIコンテナ主流でデータソース扱うのって少ない気が…。
JDBCでDB直接接続してコンテナ側がデータソース化しちゃうし。
(実際はHibernateやらiBATISやらがやってたりするが)


まぁ…わかっただけでも良しとしましょ。