8.7.4. EJB 呼び出しのトランザクション動作
サーバー間の呼び出し
分散 JBoss EAP アプリケーションのトランザクション属性は、アプリケーションが同じサーバー上で呼び出されているかのように処理する必要があります。トランザクションを中止するには、別のインターフェイスを使用して宛先メソッドに REQUIRES_NEW のマークを付ける必要があります。
クライアント側の呼び出し
JBoss EAP 6 スタンドアロンクライアントで EJB セッション Bean を呼び出すには、EJB プロキシーまたは UserTransaction が使用されている間、クライアントは InitialContext オブジェクトへの参照を持っている必要があります。また、EJB プロキシーまたは UserTransaction が使用されている間、InitialContext オブジェクトを開いたままにしておくことも重要です。接続の制御は、InitialContext によってプロパティーを使用して作成されたクラス内で行われます。
InitialContext オブジェクトへの参照を保持する EJB クライアント API を示しています。
例8.6 InitialContext オブジェクトを参照する EJB クライアント API
package org.jboss.as.quickstarts.ejb.multi.server;
import java.util.Date;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.jboss.as.quickstarts.ejb.multi.server.app.MainApp;
import org.jboss.ejb.client.ContextSelector;
import org.jboss.ejb.client.EJBClientConfiguration;
import org.jboss.ejb.client.EJBClientContext;
import org.jboss.ejb.client.PropertiesBasedEJBClientConfiguration;
import org.jboss.ejb.client.remoting.ConfigBasedEJBClientContextSelector;
public class Client {
/**
* @param args no args needed
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// suppress output of client messages
Logger.getLogger("org.jboss").setLevel(Level.OFF);
Logger.getLogger("org.xnio").setLevel(Level.OFF);
Properties p = new Properties();
p.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false");
p.put("remote.connections", "one");
p.put("remote.connection.one.port", "4447");
p.put("remote.connection.one.host", "localhost");
p.put("remote.connection.one.username", "quickuser");
p.put("remote.connection.one.password", "quick-123");
EJBClientConfiguration cc = new PropertiesBasedEJBClientConfiguration(p);
ContextSelector<EJBClientContext> selector = new ConfigBasedEJBClientContextSelector(cc);
EJBClientContext.setSelector(selector);
Properties props = new Properties();
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
InitialContext context = new InitialContext(props);
final String rcal = "ejb:jboss-ejb-multi-server-app-main/ejb//" + ("MainAppBean") + "!" + MainApp.class.getName();
final MainApp remote = (MainApp) context.lookup(rcal);
final String result = remote.invokeAll("Client call at "+new Date());
System.out.println("InvokeAll succeed: "+result);
}
}
UserTransaction 参照の取得は、スコープ付き EJB クライアントコンテキストを使用するシナリオ、および リモートネーミング プロトコルを使用する呼び出しではサポートされていません。これは、これらのシナリオでは、InitialContext が独自の EJB クライアントコンテキストインスタンスをカプセル化するためです。これは、EJBClient クラスの静的メソッドを使用してアクセスすることはできません。いつEJBClient.getUserTransaction()が呼び出されると、デフォルトの (グローバル)EJB クライアントコンテキスト (初期化されていない可能性があります) からではなく、目的のコンテキストからトランザクションを返します。
クライアント側の UserTransaction リファレンス
次の例は、スタンドアロンクライアントで UserTransaction 参照を取得する方法を示しています。
例8.7 UserTransaction オブジェクトを参照するスタンドアロンクライアント
import org.jboss.ejb.client.EJBClient;
import javax.transaction.UserTransaction;
.
.
Context context=null;
UserTransaction tx=null;
try {
Properties props = new Properties();
// REMEMBER: there must be a jboss-ejb-client.properties with the connection parameter
// in the clients classpath
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
context = new InitialContext(props);
System.out.println("\n\tGot initial Context: "+context);
tx=EJBClient.getUserTransaction("yourServerName");
System.out.println("UserTransaction = "+tx.getStatus());
tx.begin();
// do some work
...
}catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
if(context != null) {
context.close();
}
}
UserTransaction 参照を取得するには;次のシステムプロパティー -Djboss.node.name=yourServerName を使用してサーバーを起動し、クライアント側で次のように使用します。
tx=EJBClient.getUserTransaction("yourServerName");
UserTransaction を使用することはできません。