WebCGIRoleでPHPを使う

基本的な設定は,ここを参考にすれば良い.しかし,Azure Cloud Tools 1.3 を使用している場合,HTTP 500 Internal Server Error が出ることがある.この場合,ServiceDefinition.csdef の <Sites> 要素を削除する必要があるらしい.

<WebRole name="WebCgiRole1" enableNativeCodeExecution="true">
  <!--
  <Sites>
    <Site name="Web">
      <Bindings>
        <Binding name="Endpoint1" endpointName="Endpoint1" />
      </Bindings>
    </Site>
  </Sites>
  -->
  <Endpoints>
    <InputEndpoint name="Endpoint1" protocol="http" port="8080" />
  </Endpoints>
  <Imports>
    <Import moduleName="Diagnostics" />
  </Imports>
</WebRole>

参考: Avkash Chauhan’s Blog

カテゴリー: Azure | コメントする

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 | タグ: , , , | コメントする

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 | タグ: , , , | コメントする