「JBoss」EJB のトランザクションタイムアウトを設定する
JBoss で EJB のトランザクションタイムアウトを設定する方法調べました。その時のメモ。
[ 環境情報 ]
Windows 7 SP1
JBoss Application Server 7.1.1.Final
Java SE 7 Update 45
設定方法としては、以下の 3 通りが確認できました。
1. standalone.xml の coordinator-environment 要素の default-timeout 属性 2. @TransactionTimeout アノテーション 3. jboss-ejb3.xml の tx:trans-timeout 要素
1 は JBoss のデフォルトの状態で設定されてます ( 300 秒 )。なので、デフォルトでもトランザクションタイムアウトは有効みたいですね。で、2、3 を設定することで 1 の設定を上書きできるって感じやと思います。
ちょっと検証してみました。
**************
● 1 のパターン
**************
以下の EJB を作成する
■ RemoteTimeout.java
package timeout; public interface RemoteTimeout { String timeout(); }
■ TimeoutBean.java
package timeout; import javax.ejb.Remote; import javax.ejb.Stateless; @Stateless @Remote(RemoteTimeout.class) public class TimeoutBean implements RemoteTimeout { @Override public String timeout() { try { // トランザクションタイムアウト時間 10 秒に対して 20 秒処理を停止 Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } return "timeout method"; } }
coordinator-environment 要素の default-timeout 属性を変更
■ standalone.xml
<coordinator-environment default-timeout="10"/>
以下のクライアントコードを作成して実行する
■ TimeoutClient.java
package timeout; import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; public class TimeoutClient { private static final String JNDI_NAME = "ejb:/EJBTest//TimeoutBean!timeout.RemoteTimeout"; public static void main(String[] args) throws Exception { final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties); RemoteTimeout rt = (RemoteTimeout) context.lookup(JNDI_NAME); System.out.println(rt.timeout()); } }
すると、以下のように javax.ejb.EJBTransactionRolledbackException が発生する。
Exception in thread "main" javax.ejb.EJBTransactionRolledbackException: Transaction rolled back - ( 略 ) - Caused by: javax.transaction.RollbackException: ARJUNA016063: The transaction is not active! - ( 略 ) -
**************
● 2 のパターン
**************
TimeoutBean.java に @TransactionTimeout を設定する。
■ TimeoutBean.java
package timeout; import javax.ejb.Remote; import javax.ejb.Stateless; @Stateless @Remote(RemoteTimeout.class) public class TimeoutBean implements RemoteTimeout { @Override // 以下を追記 @TransactionTimeout(value = 10, unit = TimeUnit.SECONDS) public String timeout() { try { // トランザクションタイムアウト時間 10 秒に対して 20 秒処理を停止 Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } return "timeout method"; } }
クライアントコードを実行すると、上記と同様の例外が発生する。
例えば、「standalone.xml で 10 秒」、「@TransactionTimeout で 30 秒」と設定して 20 秒処理を停止するとどうなるかというと、この場合はタイムアウトは発生しませんでした ( クライアント側で timeout method が出力される )。なので、2 では 1 の設定を上書きするみたいです。
**************
● 3 のパターン
**************
META-INF 配下に jboss-ejb3.xml を以下の内容で作成する。
■ jboss-ejb3.xml
<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:tx="urn:trans-timeout" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd urn:trans-timeout http://www.jboss.org/j2ee/schema/trans-timeout-1_0.xsd" version="3.1" impl-version="2.0"> <assembly-descriptor> <container-transaction> <method> <ejb-name>TimeoutBean</ejb-name> <method-name>timeout</method-name> <method-intf>Remote</method-intf> </method> <tx:trans-timeout> <tx:timeout>10</tx:timeout> <tx:unit>Seconds</tx:unit> </tx:trans-timeout> </container-transaction> </assembly-descriptor> </jboss:ejb-jar>
クライアントコードを実行すると、これまでと同様の例外が発生する。
で、3 も 1 の設定を上書きする感じでした。
ドキュメントは以下あたりになりますね。
・EJB 3 Reference Guide - JBoss AS 7.1 - Project Documentation Editor
https://docs.jboss.org/author/display/AS71/EJB+3+Reference+Guide#EJB3ReferenceGuide-TransactionTimeout
以上です。