よく使うasadminのコマンドを紹介する

これは GlassFish Advent Calendar 2014 の7日目です。

小ネタです。 私がよく使うasadminのコマンドを、引数も書いて実際に使っている感じを出しつつ紹介します。

asadmin list-commands
どんなコマンドあったっけなー、ってときどき確認します。
asadmin list-domain
GlassFishはドメインという単位で管理しますが、このコマンドで今あるドメインを確認します。
asadmin delete-domain domain1
要らんドメインを消します。 ドメインは glassfish/domains/ 以下に作成されますが、ここを心を込めて手動で消しても大丈夫っぽいです。
asadmin create-domain --portbase=9000 domain1
ドメインを作ります。 portbaseを指定すればHTTPは9080、管理は9048という風に良い感じにポートを設定してくれます。
asadmin start-domain domain1
ドメインを起動します。 後述するcreate-jdbc-connection-poolコマンドなど一部のコマンドはドメインが起動していないと実行できなかったりします。
asadmin stop-domain domain1
起動しているドメインを停止します。
asadmin create-jdbc-connection-pool --datasourceclassname org.h2.jdbcx.JdbcDataSource --restype javax.sql.DataSource --property url=jdbc\\:h2\\:sampleDB:user=sa:password=secret samplePool
JDBCコネクションプールを作ります。 propertyにURLを書く場合、コロンをエスケープしないといけないので気をつけましょー。 一番最後の引数(この例でいうとsamplePool)がコネクションプールIDです。 なお、JDBCドライバは glassfish/domains/domain1/lib/ext/ (domain1はドメインの名前なので適宜置き換えてください)に置きます。
asadmin create-jdbc-resource --connectionpoolid samplePool jdbc/sample
JDBCリソースを作ります。 アプリケーションからはここで設定したJNDI名(この例でいうとjdbc/sample)で参照します。 ひとつのJDBCコネクションプールに対して複数のJDBCリソースを作ることもできます。
asadmin create-jvm-options -Xmx1024m
JVMオプションを設定します。 この例では最大メモリサイズを設定しています。 このコマンドで設定したJVMオプションはドメインを再起動したときに反映されます。
asadmin set-log-levels org.seasar.doma=CONFIG
ログレベルを設定します。
asadmin deploy --contextroot=sample --name=sample sample.war
デプロイします。
asadmin redeploy --name=sample sample.war
再デプロイします。 デプロイと再デプロイでコマンドを使い分けなきゃダメなのはちょっと面倒です。
asadmin undeploy sample
アンデプロイします。 引数にはデプロイ時に設定したnameを指定します。

とまあ、よく使うのはこんな所でしょうか。 自分が思っていたより少なかったですね。

簡単ですが、以上になります。 おそまつさまでした。

どうやってApplicationサブクラスの名前取ってきてんの?

これは JavaFX Advent Calendar 2014 の7日目です。

小ネタです。

JavaFXアプリケーションのメインクラスは次のように書きますよね。

import javafx.application.Application;
import javafx.stage.Stage;

public class Hoge extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        //略
    }
}

これを初めて見たとき、launchメソッドにApplicationサブクラスのインスタンスや Classを渡してるわけでもないのにインスタンス化されてstartメソッドが呼ばれるのが キモいなー、と思ったのでした。

で、だいたい予想はつきましたが、Application.javaを読んでみました。 その部分を引用します。

// Figure out the right class to call
StackTraceElement[] cause = Thread.currentThread().getStackTrace();

boolean foundThisMethod = false;
String callingClassName = null;
for (StackTraceElement se : cause) {
    // Skip entries until we get to the entry for this class
    String className = se.getClassName();
    String methodName = se.getMethodName();
    if (foundThisMethod) {
        callingClassName = className;
        break;
    } else if (Application.class.getName().equals(className)
            && "launch".equals(methodName)) {

        foundThisMethod = true;
    }
}

という感じで、スタックトレースを取得して現在のメソッド(launch)のひとつ前の メソッド名(main)とクラス名(Hoge)を取得していました。

予想通り割とキモい方法でクラス名を取ってきていたことが分かって満足です。

JavaFXである必要性の薄い内容でしたが、以上になります。 おそまつさまでした。