Servlet で Velocity (1.6.4) を使う

Servlet で Velocity を使用する場合,org.apache.velocity.runtime.log.ServletLogChute エラーが出ることがある.これは,デフォルトログシステムの初期化に失敗しているからで,ServletContext を渡すか別のログシステムを使えば解決する.

ServletContext を渡す場合,次のようにすれば良い.

VelocityEngine engine = new VelocityEngine();
engine.setApplicationAttribute(
        ServletContext.class.getName(), servletContext);
engine.init();

また,別のログシステムを使用する場合は,runtime.log.logsystem.class プロパティに設定する.

参考: Apache

カテゴリー: Java | タグ: apache, java, servlet, velocity | コメントをどうぞ

Arm 用 OpenJDK で Selector#select の挙動がおかしい

ARM 用の OpenJDK VM (OpenJDK Core VM) では,選択できるキーが有ろうが無かろうが一つのキーも選択せずに Selector#select() が即座に返る.そして CPU 使用率がどんどん上がっていく.

final Selector sel = Selector.open();
final ServerSocketChannel s = ServerSocketChannel.open();
s.configureBlocking(false);
s.socket().bind(address);
s.register(sel, SelectionKey.OP_ACCEPT);
while(true){
  // nc は常に 0
  final int nc = sel.select();
  for(final SelectionKey key : sel.selectedKeys()){
    if(key.isAcceptable()){
      // 適当に accept する
      ((ServerSocketChannel)key.channel()).accept();
    }
  }
}

選択できるキーが無い場合はともかく,実際に繋ぎに来ている場合でも無視されるので使い物にならない.なお,別の VM (OpenJDK Zero VM) に切り替えたところ正常に動いた.

カテゴリー: Java | タグ: arm, bug, java, openjdk | コメントをどうぞ