設定はとても退屈なトピックと極めて退屈な気晴らしです。 あいにく、何行かの XML は、Seam を JSF 実装と サーブレットコンテナに統合するのに必要です。 以降の章から、うんざりする必要はありません。 サンプルアプリケーションから、 簡単にコピー/ペーストできるため これらを直接、打ち込む必要はありません。
最初に、JSF と Seam を使うときにはいつでも必要な基本的な設定から見てみましょう。
Seam は web.xml ファイル中に以下の設定が必要です。
<listener> <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> </listener>
このリスナは、Seam をブートストラップすることと、セッションあるいはアプリケーションコンテキストの破棄を、担当しています。
JSFのリクエストのライフサイクルでSeamを統合するためにfaces-config.xml中でJSFのPhaseListenerを登録しておく必要があります。
<lifecycle> <phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener> </lifecycle>
実際、ここでのリスナクラスは、どのようなトランザクション区分 (詳細は以下) を必要とするかに応じて、変更する必要があります。
もしSunの JSF 1.2 参照実装を使用しているのであれば、下の記述もfaces-config.xml に必要になります。
<application> <el-resolver>org.jboss.seam.jsf.SeamELResolver</el-resolver> </application>
(この記述は必ずしも必要とは言えませんが、RIのマイナーなバグを回避するのに役立ちます。)
JSF の実装の一部にはサーバサイドでの状態の保持の実装にバグが有る物がありますが、 Seamは対話の為にこの部分を使用しています。 もし、フォームの送信で問題が有る場合には、クライアント側に 状態を保持するようにしてみてください。この場合、web.xmlに以下を記述します。
<context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param>
Seam リソース Servlet は Seam Remoting 、キャプチャ (セキュリティの章を参照) や JSF の UI の制御で使用されるリソースを提供します。 Seam リソース Servlet の設定には web.xml に以下の記述が必要です。
<servlet> <servlet-name>Seam Resource Servlet</servlet-name> <servlet-class>org.jboss.seam.servlet.ResourceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Seam Resource Servlet</servlet-name> <url-pattern>/seam/resource/*</url-pattern> </servlet-mapping>
Seam は基本的な動作には servlet フィルターを必要としません。 しかし、Seamには、フィルターの使用を前提とした 幾つかの機能があり、Seamの組み込みコンポーネントの設定と同様の方法で、servletフィルターを設定することが出来るようになっています。 この機能を使用するためには、まづ、web.xmlに下のように、マスターフィルターを設定する必要があります。
<filter> <filter-name>Seam Filter</filter-name> <filter-class>org.jboss.seam.web.SeamFilter</filter-class> </filter> <filter-mapping> <filter-name>Seam Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
マスターフィルタを組み込むことにより、以下の組み込みフィルタを使用できるようになります。
このフィルタは例外をpages.xmlにマッピングする機能があります。 (ほとんどのアプリケーションで必要な機能です。) また、捕捉出来ないエラーがトランスアクションで発生した場合にロールバック 処理を行います。 (Java EE 仕様に従えば、webコンテナがこの処理を自動的に行う必要が有りますが、すべてのアプリケーションサーバが この機能を正しく実装しているとは言えないことが分かっています。 勿論、Tomcatのような単純なsevletエンジンではこの 機能は必要有りません。)
デフォルトで、すべてのリクエストに対して例外処理フィルタが適用されますが、下のように、 components.xmlに<web:exception-filter>を記述して、 これを変更することもできます。
<components xmlns="http://jboss.com/products/seam/components" xmlns:core="http://jboss.com/products/seam/core" xmlns:web="http://jboss.com/products/seam/web" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-1.2.xsd http://jboss.com/products/seam/components http://jboss.com/products/seam/components-1.2.xsd http://jboss.com/products/seam/web http://jboss.com/products/seam/web-1.2.xsd"> <web:exception-filter url-pattern="*.seam"/> </components>
url-pattern — どのリクエストをフィルタするか指定します。 デフォルトではすべてのリクエストになります。
このフィルタはSeamがブラウザのリダイレクトにより対話コンテキストを伝搬する事を可能にします。 ブラウザリダイレクトをインターセプトし、Seamの対話identifierをパラメータに追加することにより、実現しています。
リダイレクトフィルタも、デフォルトですべてのリクエストを対象としますが、 components.xmlの記述を以下のようにして変更することが可能です。
<web:redirect-filter url-pattern="*.seam"/>
url-pattern — どのリクエストをフィルタするか指定します。 デフォルトではすべてのリクエストになります。
この機能はファイルのアップロードの時のJSF制御に必要となります。マルチパートフォームのリクエストを検出すると、 RFC-2388 (multipart/form-data 仕様) に従い処理を行います。 デフォルトの設定をオーバーライドするためには components.xmlに以下の設定を追加します。
<web:multipart-filter create-temp-files="true" max-request-size="1000000" url-pattern="*.seam"/>
create-temp-files — trueにすると、 アップロードされたファイルはメモリ中ではなく、テンポラリファイルに書き込まれます。 大きなファイルのアップロードが考えられるような場合には重要となります。 デフォルトではfalseとなっています。
max-request-size — リクエストヘッダー中の Content-Lengthで示されるアップロードファイルのサイズがこの値を越えた場合、リクエストは中断されます。 デフォルトの設定は 0 (ファイルのサイズを制限しません)。
url-pattern — どのリクエストをフィルタするか指定します。 デフォルトではすべてのリクエストになります。
送信されたフォームデータのキャラクターエンコーディングをセットします。
デフォルトではこのフィルタはインストールされていませんので、components.xml に以下の記述が必要です。
<web:character-encoding-filter encoding="UTF-16" override-client="true" url-pattern="*.seam"/>
encoding — 使用するエンコーディングです。
override-client — true に設定されていた場合、リクエストがエンコーディングを指定しているか否かに関わらず、encodingで 指定されたエンコーディングを使用します。 falseに設定されていた場合には、リクエストがエンコーディングを指定していない場合に限りencodingで指定されたエンコーディングを使用します。 デフォルトでfalseに設定されています。
url-pattern — どのリクエストをフィルタするか指定します。 デフォルトではすべてのリクエストになります。
JSF servlet以外の servletに直接送信されるリクエストは、JSFのライフサイクルでは処理されません。 そこで、Seamは Seamのコンポーネントにアクセスする必要の有る その他の servletに対して servletフィルタを提供しています。
このフィルタを適用することにより、カスタムservletが Seamコンテキストと相互に作用することを可能にします。 個々のリクエストの最初にSeamコンテキストをセットアップし、リクエストの終了畤にこれを破棄します。このフィルタは JSFの FacesServlet には決して適用されない事を銘記してください。 Seam はJSFのリクエストのコンテキスト管理には phase listenerを使用します。
デフォルトではこのフィルタはインストールされていませんので、components.xml に以下の記述が必要です。
<web:context-filter url-pattern="/media/*"/>
url-pattern — どのリクエストをフィルタするのか指定します。 デフォルトではすべてのリクエスト。 コンテキストフィルタに url-pattern が指定されていればフィルタが適用されます (明示的に使用不可としていない限り)。
コンテキストフィルタはconversationIdという名前でリクエストパラメータ中に対話 id を探そうとします。必ず、リクエストパラメータに対話 idを含めるようにしてください。
また、新たな対話 idをクライアント側に確実に伝える必要があります。 Seamは組み込みコンポーネント conversationのプロパティとして対話 idを公開しています。
SeamInterceptor を、 Seam コンポーネントに対応させる必要があります。 このための最も簡単な方法は、 次のインターセプタバインディングを、 ejb-jar.xml の中の <assembly-descriptor> に、 追加することです。
<interceptor-binding> <ejb-name>*</ejb-name> <interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class> </interceptor-binding>
Seam は、セッション Bean が JNDI でどこにあるかを知る必要があります。 このための方法の 1 つは、 それぞれの Session Bean コンポーネントに、@JndiName を指定することです。 しかし、 これではつまらな過ぎます。 もっと良い方法は、 EJB 名から JNDI 名を判断するために、 Seam が使用するパターンを指定することです。 あいにく、EJB3 標準に定義されたグローバル JNDI をマッピングする標準は存在しないため、 このマッピングはベンダ固有になります。 通常、components.xmlにこのオプションを指定します。
JBossアプリケーションサーバでは、次のパターンは誤りではありません。
<core:init jndi-name="myEarName/#{ejbName}/local" />
ここで、myEarNameは、Bean がデプロイされた EAR の名前です。
EAR のコンテキストの外側では (JBoss 組み込み可能 EJB3 コンテナを使用するとき)、 次のパターンは使い方の 1 つです。
<core:init jndi-name="#{ejbName}/local" />
他のアプリケーションサーバでの正しい記述については実験してみる必要があります。GlassFishのようなアプリケーションサーバ では、すべてのEJBコンポーネントについて明示的にJNDI名が決められている必要があります。 この場合、独自のパターンを決める必要があります。
我々の意見を聞き入れていただいて、JSPの替わりに faceletを使っていただけるとしたら、faces-config.xmlに以下の設定が必要です。
<application> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> </application>
そして、 web.xmlに下の記述も必要です。
<context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param>
最後にもう一つ理解しておくことがあります。 Seamコンポーネントが配備されるどのようなアーカイブにも、 seam.properties、META-INF/seam.properties あるいは META-INF/components.xmlを作成しておく必要があります (空のファイルであってもかまいません)。 Seamは起動時に seamコンポーネントを探すために、すべてのアーカイブでseam.propertiesをスキャンします。
Seamコンポーネントが有る場合には、webアーカイブ (WAR) のWEB-INF/classesディレクトリに seam.propertiesファイルを作成する必要があります。
これが、Seamのサンプルアプリケーションすべてに、空のseam.propertiesが存在する理由です。 (空であっても) これを削除するとアプリケーションが動作しなくなります。
空のファイルで有っても、存在しないと動かないようなフレームワークを作るようなデザイナーは、ちょっとオカシイと思われるかもしれませんが、これは JVM の制約を回避するための方策です — もし、このようなメカニズムを使わないとすれば、次善の方法は、 他の競合するフレームワークで行われているように、 components.xmlにすべてのコンポーネントを明示的に記述することです。 多分、我々の選択の方を気に入っていただけると思います。
Java EE 5 環境で実行するならば、 Seam の使用を始めるために必要な設定はこれだけです。
これらすべてを EAR にパッケージングしたならば、 アーカイブの構造は以下のようになります。
my-application.ear/ jboss-seam.jar el-api.jar el-ri.jar META-INF/ MANIFEST.MF application.xml my-application.war/ META-INF/ MANIFEST.MF WEB-INF/ web.xml components.xml faces-config.xml lib/ jsf-facelets.jar jboss-seam-ui.jar login.jsp register.jsp ... my-application.jar/ META-INF/ MANIFEST.MF persistence.xml seam.properties org/ jboss/ myapplication/ User.class Login.class LoginBean.class Register.class RegisterBean.class ...
EARのクラスパスに jboss-seam.jar, el-api.jar それにel-ri.jar を含めておく必要があります。また、これらすべての jar ファイルが application.xmlから参照できるようにしておく必要があります。
もし、jBPM や Droolsを使用するのであれば、それらに必要な jarファイルを EARのクラスパスに含めて おかなければなりません。また、これらすべての jar ファイルがapplication.xmlから参照できるように しておく必要があります。
facelets を使用する場合 (推奨) は WARのWEB-INF/libディレクトリに jsf-facelets.jarを含める必要があります。
Seam のタグライブラリを使用する場合には (ほとんどの Seam アプリケーションで使用される)、 WAR ファイルの WEB-INF/lib ディレクトリに jboss-seam-ui.jar を含める必要があります。 PDFや email のタグライブラリを使用する場合には、 WEB-INF/lib に jboss-seam-pdf.jar または jboss-seam-mail.jar を含める必要があります。
Seam デバッグページを使用する (facelets を使用している場合のみ利用可能) 場合には WARの WEB-INF/libディレクトリにjboss-seam-debug.jarを含めます。
サンプルアプリケーションには EJB 3.0をサポートする Java EEコンテナに配備可能な幾つかの Seam アプリケーションがふくまれています。
「さー、ここまでで設定は終わりですよ」と言えれば良いのですが、また3分の一が終わったところです。もし、 もう飽き飽きしておられたら、残りは飛ばして、必要な時にまた読み返すようにしていただいてもかまいません。
JBoss 組み込み可能 EJB3 コンテナは、 Java EE 5 アプリケーションサーバのコンテキストの外側で EJB3 コンポーネントを稼動させることができ、特にアプリケーションのテストを行うとき (それだけに限ることは有りませんが) に有用です。
Seam 予約サンプルアプリケーションは、 組み込み可能 EJB3 コンテナの上でも動作可能な、 TestNG 統合テストスイートを含んでいます。
この予約サンプルアプリケーションは Tomcat にもデプロイ可能です。
Seam は、embedded-ejb ディレクトリに、 組み込み可能 EJB3 コンテナの構造を付けて 出荷しました。 Seam で組み込み可能 EJB3 コンテナを使うためには、 embedded-ejb/conf ディレクトリ、 そして、lib と embedded-ejb/lib ディレクトリのすべての JAR に、クラスパスを 通してください。 その次に、components.xml に以下の行を追加してください。
<core:ejb />
この設定は、org.jboss.seam.core.ejb と呼ばれる組み込みコンポーネントをインストールします。 このコンポーネントは、 Seam が起動されるときに EJB コンテナのブートストラップを、 WEB アプリケーションがアンデプロイされるときに シャットダウンを担当します。
コンテナ設定に関する詳細な情報は、 組み込み可能 EJB3 コンテナのドキュメントを、 参照してください。 少なくともデータソースの設定は必要になるでしょう。 組み込み可能 EJB3 は JBoss のマイクロコンテナを使用して実装されているため、 デフォルトで提供された最小限のサービス一式によって、 簡単に新しいサービスを追加することができます。 例えば、この jboss-beans.xml ファイルをクラスパスに通すことで、 新しいデータソースを追加することが可能です。
<?xml version="1.0" encoding="UTF-8"?> <deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd" xmlns="urn:jboss:bean-deployer"> <bean name="bookingDatasourceBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> <property name="driverClass">org.hsqldb.jdbcDriver</property> <property name="connectionURL">jdbc:hsqldb:.</property> <property name="userName">sa</property> <property name="jndiName">java:/bookingDatasource</property> <property name="minSize">0</property> <property name="maxSize">10</property> <property name="blockingTimeout">1000</property> <property name="idleTimeout">100000</property> <property name="transactionManager"> <inject bean="TransactionManager"/> </property> <property name="cachedConnectionManager"> <inject bean="CachedConnectionManager"/> </property> <property name="initialContextProperties"> <inject bean="InitialContextProperties"/> </property> </bean> <bean name="bookingDatasource" class="java.lang.Object"> <constructor factoryMethod="getDatasource"> <factory bean="bookingDatasourceBootstrap"/> </constructor> </bean> </deployment>
Tomcat のような サーブレットエンジンへの WAR ベースのデプロイメントのアーカイブの構造は、以下のようになります。
my-application.war/ META-INF/ MANIFEST.MF WEB-INF/ web.xml components.xml faces-config.xml lib/ jboss-seam.jar jboss-seam-ui.jar el-api.jar el-ri.jar jsf-facelets.jar myfaces-api.jar myfaces-impl.jar jboss-ejb3.jar jboss-jca.jar jboss-j2ee.jar ... mc-conf.jar/ ejb3-interceptors-aop.xml embedded-jboss-beans.xml default.persistence.properties jndi.properties login-config.xml security-beans.xml log4j.xml my-application.jar/ META-INF/ MANIFEST.MF persistence.xml jboss-beans.xml log4j.xml seam.properties org/ jboss/ myapplication/ User.class Login.class LoginBean.class Register.class RegisterBean.class ... login.jsp register.jsp ...
mc-conf.jarは、 組み込み可能 EJB3 用の 標準のJBoss マイクロコンテナ 設定ファイルを含みます。 通常、これらのファイルを編集する必要はないでしょう。
ほとんどの Seam サンプルアプリケーションは、ant deploy.tomcat を実行することによって、 Tomcat にデプロイすることも可能です。
Seam は、EJB 3.0 を始める準備ができていなくても有用です。 この場合、 EJB 3.0 永続性の代わりにHibernate3 もしくは JPAを、 セッション Bean の代わりに plain JavaBeans を使用します。 セッションBeanのすばらしい特徴のいくらかは 失うかもしれませんが、 準備ができたとき、EJB 3.0 に移行することができ、 それまでの間、Seam のユニークな宣言的状態管理 アーキテクチャを利用が可能となります。
Seam JavaBean コンポーネントはセッション Bean がするような宣言的トランザクション区分は提供しません。 JTA UserTransactionを使用して、 マニュアルでトランザクションを管理することもできるかもしれません。 (Seam インターセプタで独自の宣言的トランザクション管理もできるかもしれません。) しかし、JavaBean といっしょに Hibernate を 使用する場合、 ほとんどのアプリケーションは、 Seam 管理トランザクションを使用するでしょう。 SeamExtendedManagedPersistencePhaseListenerを有効にするためには、 永続性の章の指示に従ってください。
Seam の配布には、EJB3 の代わりに Hibernate や JavaBean を使用した 予約サンプルアプリケーションが含まれています。 このサンプルアプリケーションはどんなJ2EEアプリケーションサーバでも すぐにデプロイ可能です。
Seam は組み込みコンポーネント (org.jboss.seam.core.hibernate ) がインストールされていれば、 hibernate.cfg.xml ファイルから、HibernateのSessionFactoryをブートストラップします。
<core:hibernate-session-factory name="hibernateSessionFactory"/>
この時、インジェクションを使って、Seamの管理する HibernateのSessionを利用するのであれば、 managed sessionを設定する必要があります。
Seam はもし組み込みコンポーネントがインストールされていれば、persistence.xml からEntityManagerFactory JPAをブートストラップします。
<core:entity-manager-factory name="entityManagerFactory"/>
インジェクションを使って、Seamの管理する JPA, EntityManagerを利用するためには、 managed persistencece contextを設定する必要があります。
アプリケーションは WARとしてパッケージすることが出来、その構成は以下の様になります。
my-application.war/ META-INF/ MANIFEST.MF WEB-INF/ web.xml components.xml faces-config.xml lib/ jboss-seam.jar jboss-seam-ui.jar el-api.jar el-ri.jar jsf-facelets.jar hibernate3.jar hibernate-annotations.jar ... my-application.jar/ META-INF/ MANIFEST.MF seam.properties hibernate.cfg.xml org/ jboss/ myapplication/ User.class Login.class Register.class ... login.jsp register.jsp ...
Tomcatや TestNGのような非 Java EE環境下で Hibernate を配備する場合には、もう少し設定が必要です。
Seamは JTAと JCAデータソースを要求する Hibernate および JPAをサポートしています。tomcat や TestNGのような、非 Java EE環境下でJBossマイクロコンテナを使用して、これらのサービスや Hibernateを走らせる事ができます。
予約システムサンプルアプリケーションの Hibernateと JPAのバージョンを tomcat上に配備することも出来ます。
Seam のサンプルファイルのmicrocontainer/conf/jboss-beans.xmlにあるマイクロコンテナ設定には、非 Java EE環境下でHibernateと共にSeamを走らせる為に必要な設定のすべてがあります。 microcontainer/confディレクトリを作り、サンプルのlib と microcontainer/lib ディレクトリに有る jar ファイルをクラスパスに追加してください。 詳細は、JBoss マイクロコンテナのドキュメンテーションを参照してください。
Seamの組み込みコンポーネントorg.jboss.seam.core.microcontainerが、マイクロンテナをブートストラップします。 ここでも、Seamの管理するセッションとして使用します。
<core:microcontainer/> <core:managed-hibernate-session name="bookingDatabase" auto-create="true" session-factory-jndi-name="java:/bookingSessionFactory"/>
ここで java:/bookingSessionFactory はhibernate.cfg.xmlで指定された Hibernaeteのファクトリの名前です。
JNDI、JTA、JCAデータソース、それに Hibernateをマイクロコンテナにインストールするためにjboss-beans.xml ファイルが必要です。
<?xml version="1.0" encoding="UTF-8"?> <deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd" xmlns="urn:jboss:bean-deployer"> <bean name="Naming" class="org.jnp.server.SingletonNamingServer"/> <bean name="TransactionManagerFactory" class="org.jboss.seam.microcontainer.TransactionManagerFactory"/> <bean name="TransactionManager" class="java.lang.Object"> <constructor factoryMethod="getTransactionManager"> <factory bean="TransactionManagerFactory"/> </constructor> </bean> <bean name="bookingDatasourceFactory" class="org.jboss.seam.microcontainer.DataSourceFactory"> <property name="driverClass">org.hsqldb.jdbcDriver</property> <property name="connectionUrl">jdbc:hsqldb:.</property> <property name="userName">sa</property> <property name="jndiName">java:/hibernateDatasource</property> <property name="minSize">0</property> <property name="maxSize">10</property> <property name="blockingTimeout">1000</property> <property name="idleTimeout">100000</property> <property name="transactionManager"><inject bean="TransactionManager"/></property> </bean> <bean name="bookingDatasource" class="java.lang.Object"> <constructor factoryMethod="getDataSource"> <factory bean="bookingDatasourceFactory"/> </constructor> </bean> <bean name="bookingSessionFactoryFactory" class="org.jboss.seam.microcontainer.HibernateFactory"/> <bean name="bookingSessionFactory" class="java.lang.Object"> <constructor factoryMethod="getSessionFactory"> <factory bean="bookingSessionFactoryFactory"/> </constructor> <depends>bookingDatasource</depends> </bean> </deployment>
WAR は下のような構成になります。
my-application.war/ META-INF/ MANIFEST.MF WEB-INF/ web.xml components.xml faces-config.xml lib/ jboss-seam.jar jboss-seam-ui.jar el-api.jar el-ri.jar jsf-facelets.jar hibernate3.jar ... jboss-microcontainer.jar jboss-jca.jar ... myfaces-api.jar myfaces-impl.jar mc-conf.jar/ jndi.properties log4j.xml my-application.jar/ META-INF/ MANIFEST.MF jboss-beans.xml seam.properties hibernate.cfg.xml log4j.xml org/ jboss/ myapplication/ User.class Login.class Register.class ... login.jsp register.jsp ...
SeamのjBPMインテグレーションはデフォルトでは、設定されませんので、 組み込みコンポーネントを設定することで、jBPMを有効化します。 また、プロセスとページフローをcomponents.xmlに 明示的に指定しなければいけません:
<core:jbpm> <core:pageflow-definitions> <value>createDocument.jpdl.xml</value> <value>editDocument.jpdl.xml</value> <value>approveDocument.jpdl.xml</value> </core:pageflow-definitions> <core:process-definitions> <value>documentLifecycle.jpdl.xml</value> </core:process-definitions> </core:jbpm>
ページフローのみの指定であれば、これ以上の設定は不要です。プロセス定義を 利用する場合、jBPM設定を用意しなければなりません、あわせて、jBPMで利用する Hibernate設定も用意する必要があります。Seam DVD Store demoは Seam で機能する jbpm.cfg.xmlとhibernate.cfg.xmlを含めた サンプルです:
<jbpm-configuration> <jbpm-context> <service name="persistence"> <factory> <bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory"> <field name="isTransactionEnabled"><false/></field> </bean> </factory> </service> <service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" /> <service name="scheduler" factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" /> <service name="logging" factory="org.jbpm.logging.db.DbLoggingServiceFactory" /> <service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" /> </jbpm-context> </jbpm-configuration>
ここでのもっとも重要なことは、jBPMトランザクション制御は無効になっているということです。 Seam、あるいはEJB3がJTAトランザクションを制御するべきです。
まだ、jBPM設定とプロセス/ページフロー定義を含めた場合での整理されたパッケージングフォーマット ではありません。このSeamサンプルでは、EARのルートにすべてのファイルを単純に パッケージングすることにしました。将来、標準パッケージングフォーマットを 提供しようとおもっています。EARはこのような感じになります:
my-application.ear/ jboss-seam.jar el-api.jar el-ri.jar jbpm-3.1.jar META-INF/ MANIFEST.MF application.xml my-application.war/ META-INF/ MANIFEST.MF WEB-INF/ web.xml components.xml faces-config.xml lib/ jsf-facelets.jar jboss-seam-ui.jar login.jsp register.jsp ... my-application.jar/ META-INF/ MANIFEST.MF persistence.xml seam.properties org/ jboss/ myapplication/ User.class Login.class LoginBean.class Register.class RegisterBean.class ... jbpm.cfg.xml hibernate.cfg.xml createDocument.jpdl.xml editDocument.jpdl.xml approveDocument.jpdl.xml documentLifecycle.jpdl.xml
jbpm-3.1.jarをEJB-JARとWARのマニフェストファイルに 追加することを忘れないでください。
Seamのアプリケーションをポートレットとして実行する場合には、通常の Java EE のメタデータに加えて、特定のポートレットのメタデータ (portlet.xml など) を与える必要があります。 JBoss Portal 上で稼働するよう事前設定されたブッキングデモのサンプルは examples/portal ディレクトリにあります。
また、SeamPhaseListener や TransactionalSeamPhaseListener の替わりにポートレットに固有のリスナーを使う必要があります。 SeamPortletPhaseListener 及び TransactionalSeamPortletPhaseListener はポートレットライフサイクルに適合します。 この2番目のクラスの名前については適切な物が思いつかず、このようになってしまいましたことご諒解ください。
Stateful Session Beans のタイムアウトは HTTP Sessions のタイムアウトより高くセットしておくことが非常に重要です。 これを行わないと、 SFSB はユーザーの HTTP セッションが終了する前にタイムアウトしてしまうことがあります。 JBoss Application Server のデフォルトのセッション bean タイムアウトは 30 分になっています。 これは server/default/conf/standardjboss.xml 内で設定されています (default はご使用の設定に置き換えてください)。
デフォルトの SFSB タイムアウトは LRUStatefulContextCachePolicy キャッシュ設定内の max-bean-life の値を変更して調整することができます。
<container-cache-conf> <cache-policy>org.jboss.ejb.plugins.LRUStatefulContextCachePolicy</cache-policy> <cache-policy-conf> <min-capacity>50</min-capacity> <max-capacity>1000000</max-capacity> <remover-period>1800</remover-period> <!-- SFSB timeout in seconds; 1800 seconds == 30 minutes --> <max-bean-life>1800</max-bean-life> <overager-period>300</overager-period> <max-bean-age>600</max-bean-age> <resizer-period>400</resizer-period> <max-cache-miss-period>60</max-cache-miss-period> <min-cache-miss-period>1</min-cache-miss-period> <cache-load-factor>0.75</cache-load-factor> </cache-policy-conf> </container-cache-conf>
デフォルトの HTTP セッションタイムアウトは、 JBoss 4.0.x なら server/default/deploy/jbossweb-tomcat55.sar/conf/web.xml で、 JBoss 4.2.x なら server/default/deploy/jboss-web.deployer/conf/web.xml でそれぞれ変更することができます。 このファイルの次のエントリで、 すべてのウェブアプリケーションのデフォルトセッションタイムアウトを制御します。
<session-config> <!-- HTTP Session timeout, in minutes --> <session-timeout>30</session-timeout> </session-config>
ご使用のアプリケーションの値を上書きするには、 そのアプリケーション自体の web.xml 内にこのエントリを含ませるだけで上書きできます。