2016-11-17 5 views
2

私は次のような状況を持っているが、クライアントの耳のアプリケーションに@PostConstructコールバックにリモートSLSB検索を実行し、得られたプロキシをキャッシュCDI @ApplicationScoped Beanがあります:Wildfly 8:ejbリモートプロキシスレッドセーフですか?

@ApplicationScoped 
@Typed({ ServiceInterface.class }) 
public class RemoteServiceProxy implements ServiceInterface 
{ 
    /** 
    * Remote service. 
    */ 
    private RemoteService remoteService; 

    /** 
    * Default constructor. 
    */ 
    public RemoteServiceProxy() 
    { 
     super(); 
    } 

    /** 
    * PostConstruct callback. 
    * 
    * @throws RuntimeException 
    *    Error while looking up remote proxy 
    */ 
    @PostConstruct 
    protected void onPostConstruct() 
    { 
     try 
     { 
      remoteService = serviceLocator.lookup(ActivityRemoteEntityService.class); 

      Properties jndiProps = new Properties(); 
      jndiProps.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
      jndiProps.put(Context.PROVIDER_URL, "http-remoting://localhost:8080"); 
      jndiProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); 
      jndiProps.put("jboss.naming.client.ejb.context", "true"); 

      Context context = new InitialContext(jndiProps); 

      remoteService = (RemoteService) context.lookup(
       "application.backend/application.backend-service//RemoteServiceImpl!com.application.remote.RemoteService"); 
     } catch (NamingException e) 
     { 
      throw new RuntimeException(e); 
     } 
    } 

    ... 

} 

私はキャッシュされたプロキシかどうかを知りたいですフィールドremoteServiceはスレッドセーフなので、RemoteServiceProxyには@ApplicationScopedという注釈を付けることができます。または、呼び出しごとに新しいプロキシ参照を実行する必要がありますか?または@Statelessを使用するのに最適ですか?事前

答えて

1

おかげでEJB 3.2仕様が言うには、以下のい:セッションBeanへ

3.4.9同時アクセスが

を参照しますセッションBeanの参照を取得することが許容されると複数のスレッドから同じ参照オブジェクトを同時に呼び出そうとします。ただし、結果として得られる各スレッドのクライアントの動作は、ターゲットBeanの並行処理のセマンティクスによって決まります。セッションBeanの並行処理の詳細については、第4.3.13項と第4.8.5項を参照してください。

§4.3.13では、基本的に、セッションBeanへの同時呼び出しがコンテナによってシリアル化されることが記載されています。

§4.8.5では、シングルトンセッションBeanへの同時アクセスに関するセマンティクスについて説明しています。

したがって、準拠するためには、「セッションBeanリファレンス」に必要なセマンティクスに従う必要があるため、リモートプロキシは本質的にスレッドセーフである必要があります。

このような参照を@Singleton EJBに保存すると、この参照は一度に1つのメソッド呼び出ししか同時に処理できません(そのような呼び出しは「シリアライズ」されているため)。これにより、アプリケーションに望ましくないボトルネックが発生する可能性があります。

+0

ありがとう、私の疑問は、同時にアクセスされるシングルトンBean(CDI ApplicationScoped)にwildflyプロキシリファレンスを格納するのが安全かどうか、つまりワイルドフックプロキシの実装がスレッドセーフであるかどうかです。 – landal79

+0

私は答えにさらに多くの情報を追加しました –

+0

同時性を制御するのは@Singletonではなく、セッションBeanです。 1つのセッションBeanリファレンス(プロキシ)=> 1つのセッションBeanインスタンス –

関連する問題