S-JIS[2008-08-15/2008-12-26] 変更履歴

JBoss Application Server

JBossASは、オープンソースのJ2EEサーバー
RedHat社がサポートしているものはJBossEAS(Enterprise Application Server)(JBossEAP(Enterprise Application Platform)の一部)という名で、バージョンが異なる。JBossASを元にして色々まとめたりテストしたりしたもの。
jboss.orgが元祖(オープンソース)、jboss.comredhat.comがRedHat)

JBossASのAPサーバー部分はTomcatがベースになっているらしい。
Tomcat自体はEJBの機能を持っておらず、JBossでEJBその他の機能を追加しているらしい。


サポートバージョン

JBossAS
JBoss JDK JavaEE 備考
JBossAS 4.2.2.GA 1.5 1.4、1.5の一部  
JBossAS 4.2.3.GA 1.5、1.6 JDK1.6版も用意された。
JBossAS 5.0.0.CR1 1.6 1.5 CRとは「Candidate Release」つまり「リリース候補」。
beta版を脱し、正式リリース直前ということか?

JBossEAP
JBoss JDK JavaEE Oracle 備考 更新日
JBossEAP 4.2 1.5   9i・10gR2に対し
10.2用のJDBC
   
JBossEAP 4.3 1.5、CP02から1.6に対応 1.4、1.5の一部 JBossAS 5.0.0がベース? 2008-10-04

ダウンロード

jboss-4.2.3.GA-jdk6.zipをダウンロードしてみた。
ファイルサイズは95MB程度だがSourceForgeからだと転送速度が10〜12kB/s程度しか出ない為、ダウンロードに2〜3時間かかる。


インストール

ダウンロードしてきたアーカイブを展開するだけ。

ここでは「C:\jboss」というディレクトリーを作り、その下に展開した。
「C:\jboss\jboss-4.2.3.GA」という形になっている。このディレクトリーをJBOSS_HOMEと呼ぶ。
(プログラム(ウェブアプリ)内からは、jboss.home.dirといったシステムプロパティーで取得できる。[2008-10-14]

JBossAS4.2.3のドキュメントには「コンフィグをいじって云々」と書かれているように思われるが、たぶんJDK1.5版からJDK1.6にする為の設定のことだと思われる。
JDK1.6版は特に何もいじらなくても動いた。


起動

jboss-4.2.3.GA-jdk6の場合、実行にはJRE1.6が必要。
環境変数JAVA_HOMEはjavaコマンドの場所(自分は「C:\Program Files\Java\jdk1.6.0」)をセットしておく。
環境変数JAVA_HOMEが定義されていない場合、「java」で実行できるバージョンの(つまりパスが通っている)javaコマンドが実行される。(WindowsではJDK1.6をインストールしていれば、環境変数JAVA_HOMEを定義してなくても動く)

JBOSS_HOME/bin/run.batを実行すると、コンソール(コマンドプロンプトの画面)が開く。

===============================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: C:\jboss\jboss-4.2.3.GA

  JAVA: C:\Program Files\Java\jdk1.6.0\bin\java		←ここに環境変数JAVA_HOMEが使われる

  JAVA_OPTS:  -Dprogram.name=run.bat -server -Xms128m -Xmx512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000

  CLASSPATH: C:\Program Files\Java\jdk1.6.0\lib\tools.jar;C:\jboss\jboss-4.2.3.GA\bin\run.jar

===============================================================================

しばらく待って、一番下にStartedのメッセージが出ていればOK。

22:47:19,406 INFO [Server] JBoss (MX MicroKernel) [4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181439)] Started in 30s:594ms

あとは管理画面が表示できれば成功。

Eclipseを使ったデバッグをする為の起動方法


管理画面

JBossを起動した後、ブラウザーでURLに「http://localhost:8080/」を入力すると「Welcome to JBoss」のページが表示される。
ここにはJBoss Managementという管理メニューがある。

JMX consoleのリンクをクリックすると、http://localhost:8080/jmx-console/に遷移する。
ここで、JBossが管理しているオブジェクトを見ることが出来る。

JMX仕様に則ったオブジェクトをただ表示しているだけらしいが、
画面からメソッドの引数を入力して実行ボタンを押下することで、JMXオブジェクトのメソッド呼び出しが出来てしまう!
これでオブジェクトの内容を表示したり、物によっては値を設定したり出来るらしい。

JNDIView


ディレクトリー構成

ディレクトリ・ファイル 概要 備考
インストールディレクトリ
JBOSS_HOME/)
bin run.bat JBossを起動するバッチ  
shutdown.bat JBossを終了するバッチ  
client *.jar クライアント用ライブラリー JBossAS管理外のバッチアプリで使用する。
JNDIの初期コンテキスト取得とか)
docs   DTD JBossの説明が入っているわけではない。
examples 設定例  
lib *.jar    
server default conf 設定ファイル類  
data 永続データ  
deploy デプロイ 動作させる実験
lib 全アプリ共通のライブラリー JBossが使うものも入っている。
HttpServlet等はservlet-api.jarにある。
log ログ  
tmp   earファイルwarファイルを展開したもの。
work 作業用ディレクトリー jspを変換したjavaファイルやclassファイル。


JBOSS_HOME/server/default/deploy/

ディレクトリ・ファイル 概要 更新日
jboss-web.deployer server.xml Tomcatのserver.xmlと同等。 2008-11-23
conf web.xml デフォルト(*.jspやindex.html)のサーブレット定義。 2008-11-30
*-ds.xml   データソースの設定ファイル。 2008-11-23

サンプル実験

最も単純なHTML・JSP

JBOSS_HOME/server/default/deploy/の下にディレクトリーを作る (あるいはWARファイルを置く)と自動的にデプロイされる。
「http://localhost:8080/test/」というコンテキストルートtestでアクセスしたい場合、ディレクトリー名は「test.war」とする。 (内容はWARファイルを展開したのと同じだが、単純に試すだけならWEB-INFは省略可)
デプロイされるとコンソールに以下のようなメッセージが表示される。

22:55:11,828 INFO [TomcatDeployer] deploy, ctxPath=/test, warUrl=.../deploy/test.war/

HTMLファイルJSPファイルは普通にそのディレクトリーの下に置けばよい。

>cd %JBOSS_HOME%\server\default\deploy
C:\jboss\jboss-4.2.3.GA\server\default\deploy>tree /f
〜
├─test.warsample.htmlsample.jsp
│
〜

これでhttp://localhost:8080/test/sample.htmlで そのHTMLを表示できる。


なお、JSPから変換されたjavaファイルやclassファイルは以下のような場所に置かれる。

>cd %JBOSS_HOME%\server\default\work\jboss.web\localhost\test
C:\jboss\jboss-4.2.3.GA\server\default\work\jboss.web\localhost\test>tree /f
フォルダ パスの一覧
ボリューム シリアル番号は BYYY-9ZZZ です
C:.
│  tldCache.ser
│
└─org
    └─apache
        └─jsp
                sample_jsp.class
                sample_jsp.java

ほんと、Tomcatそっくり(笑)


最も単純なサーブレット

Tomcatの場合と同様にtest.warの直下にWEB-INFを作り、その下にweb.xmlとclassesを作り、コンパイルしたサーブレットクラスをclassesに入れればよい。

なお、サーブレット(HttpServlet)をコンパイルする為に必要なライブラリーはJBOSS_HOME/server/default/lib/servlet-api.jar。

ちなみに、web.xmlを書き換えると自動的に再デプロイしてくれる。


JNDI

JNDIを使用するには最初にコンテキストを取得する必要がある

JBoss上で動くアプリ(サーブレット等)では、以下のようにして取得できる。

import javax.naming.*;

	public Context initContext() throws NamingException {
		InitialContext ctx = new InitialContext();
		return ctx;
	}

バッチアプリ(リモート)では、以下のようにして取得する。

	public static Context initContext() throws NamingException {
		Hashtable<String, String> ht = new Hashtable<String, String>();

		ht.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
//又は		ht.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.NamingContextFactory");

		ht.put(Context.PROVIDER_URL, "localhost");
//又は		ht.put(Context.PROVIDER_URL, "localhost:1099");
//又は		ht.put(Context.PROVIDER_URL, "jnp://localhost:1099");

		InitialContext ctx = new InitialContext(ht);
		return ctx;
	}

ステートレスビーンの呼び出し例

なお、実行時のクラスパスJBOSS_HOME/client/jbossall-client.jarが必要。
無いと以下のような例外が発生する。
javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]

localhost以外(リモート)のJBossのJNDIからContextを取得したい場合、JBossをIPアドレスを指定して起動する必要がある。[2008-12-06]
(そのIPアドレスをPROVIDER_URLに指定する)


JBoss内に登録されているJNDIを確認するには、JNDIViewを使う。

  1. ブラウザーで管理画面を開く。
  2. JMX Consoleをクリックする。
  3. 「jboss」⇒「service=JNDIView」をクリックする。
  4. 「List of MBean operations」⇒「java.lang.String list()」の「invoke」ボタンを押下する。
    (これは、JNDIView用のMBeanクラスのインスタンスのlist()メソッドを呼び出す動作に相当するようだ)
    すると、JNDIの一覧が表示される。
Web Applications
java:comp namespace of the http-invoker.sar/invoker.war application:
  +- UserTransaction[link -> UserTransaction] (class: javax.naming.LinkRef)
  +- env (class: org.jnp.interfaces.NamingContext)
  |   +- security (class: org.jnp.interfaces.NamingContext)
 〜

java: Namespace
  +- XAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
  +- DefaultDS (class: org.jboss.resource.adapter.jdbc.WrapperDataSource)
 〜

Global JNDI Namespace
  +- TopicConnectionFactory (class: org.jboss.naming.LinkRefPair)
  +- jmx (class: org.jnp.interfaces.NamingContext)
  |   +- invoker (class: org.jnp.interfaces.NamingContext)
  |   |   +- RMIAdaptor (proxy: $Proxy47 implements interface org.jboss.jmx.adaptor.rmi.RMIAdaptor,interface org.jboss.jmx.adaptor.rmi.RMIAdaptorExt)
  |   +- rmi (class: org.jnp.interfaces.NamingContext)
  |   |   +- RMIAdaptor[link -> jmx/invoker/RMIAdaptor] (class: javax.naming.LinkRef)
  +- HTTPXAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
  +- ConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
 〜

JMSキューの登録

JBossAS4.2.3でJMSのキューを登録するには、以下の設定ファイルに定義を追加する。[2008-08-16]

JBOSS_HOME/server/default/deploy/jms/jbossmq-destinations-service.xml:

〜
<server>
〜

  <mbean code="org.jboss.mq.server.jmx.Queue"
	name="jboss.mq.destination:service=Queue,name=MyQueue1">
    <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
  </mbean>

</server>

JNDI名としては「queue/MyQueue1」となる。
JNDIビューでは、グローバルJNDIの所に「queue」→「MyQueue1」として表示される。


もしくは、「JBOSS_HOME/server/default/deploy/jms」直下に自分で「なんちゃら-service.xml」というファイルを作ってもよい。

JBOSS_HOME/server/default/deploy/jms/hishidama-service.xml:

<?xml version="1.0" encoding="Shift_JIS"?>
<server>

  <mbean code="org.jboss.mq.server.jmx.Queue"
	name="jboss.mq.destination:service=Queue,name=MyQueue1">
    <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
  </mbean>

</server>

jmsディレクトリー配下のファイルを変更すると、自動的にデプロイされる。


参考


JBossへ戻る / Java目次へ行く / Javaサーブレットへ行く
メールの送信先:ひしだま