2016-07-05 21 views
1

私はリモートEJBを検索するために以下のutilクラスを持っています。現在、多くの場所で複製されています。一度それを書いて再利用して、どのEJBを探しているのかをインターフェイス名で伝えるだけです。一般的なリモートejb参照を作成するには?

私はJava Genericsに関する知識が限られています。ここで

@ApplicationScoped 
public class ServiceLookupUtil { 

    public static final String JBOSS_EJB_CLIENT = "org.jboss.ejb.client.naming"; 
    public static final String JBOSS_NAMING_CONTEXT = "jboss.naming.client.ejb.context"; 

    private AddressService addressService; 
    private Context context; 
    private Logger log; 


    public ServiceLookupUtil() { 
     super(); 
    } 

    @Inject 
    public ServiceLookupUtil(Logger log) { 
     this.log = log; 
    } 

    public AddressService lookupAddressService() { 

     if (addressService == null) { 
      try { 

       context = getInitialContext(); 

       log.debug("Looking up: " + getLookupName()); 
       addressService = (AddressService) context.lookup(getLookupName()); 
       return addressService; 

      } catch (Exception ex) { 
       log.error("Could not get reference to AddressService ", ex); 
      } finally { 
       if (context != null) { 
        try { 
         context.close(); 
        } catch (NamingException e) { 
         log.error(e.getMessage(), e); 
        } 
       } 
      } 
     } 
     return addressService; 
    } 

    public Context getInitialContext() { 
     try { 
      final Hashtable jndiProperties = new Hashtable(); 
      jndiProperties.put(Context.URL_PKG_PREFIXES, JBOSS_EJB_CLIENT); 
      jndiProperties.put(JBOSS_NAMING_CONTEXT, true); 
      return new InitialContext(jndiProperties); 
     } catch (NamingException e) { 
      log.error(e.getMessage(), e); 
     } 
     return context; 
    } 

    private String getLookupName() { 
     return "ejb:" + AddressService.APP_NAME + "/" + AddressService.MODULE_NAME + "/" + AddressService.BEAN_NAME + "!" + AddressService.class.getName(); 
    } 
} 

答えて

0

が答え(変化APP_NAMEMODULE_NAMEBEAN_NAME_CONVETION_ADD)です:

@ApplicationScoped 
public class ServiceLookupUtil { 

    public static final String JBOSS_EJB_CLIENT = "org.jboss.ejb.client.naming"; 
    public static final String JBOSS_NAMING_CONTEXT = "jboss.naming.client.ejb.context"; 

    private Map<String, Object> services = new HashMap<String, Object>(); 

    private Context context; 

    @Inject 
    private Logger log; 

    private static final String APP_NAME = ""; 
    private static final String MODULE_NAME = "module-ejb"; 
    private static final String BEAN_NAME_CONVETION_ADD = "Impl"; 


    public ServiceLookupUtil() { 
     super(); 
    } 

    @SuppressWarnings("unchecked") 
    public <S> S lookupService(Class<S> clazz) { 
     if (services.get(clazz.getName()) == null) { 
      S service = null; 
      try { 
       context = getInitialContext(); 
       String jndi = getLookupName(clazz); 
       log.debug("Looking up: " + jndi); 
       service = (S) context.lookup(jndi); 
       services.put(clazz.getName(), service); 
       return service; 

       } catch (Exception ex) { 
       log.error("Could not get reference to AddressService ", ex); 
       } finally { 
       if (context != null) { 
        try { 
         context.close(); 
         } catch (NamingException e) { 
         log.error(e.getMessage(), e); 
        } 
       } 
      } 
     } 
     return (S)services.get(clazz.getName()); 
    } 

    private Context getInitialContext() { 
     try { 
      final Hashtable jndiProperties = new Hashtable(); 
      jndiProperties.put(Context.URL_PKG_PREFIXES, JBOSS_EJB_CLIENT); 
      jndiProperties.put(JBOSS_NAMING_CONTEXT, true); 
      return new InitialContext(jndiProperties); 
      } catch (NamingException e) { 
      log.error(e.getMessage(), e); 
     } 
     return context; 
    } 

    private <S> String getLookupName(Class<S> clazz) { 
     return "ejb:" + APP_NAME + "/" + MODULE_NAME + "/" + clazz.getSimpleName() + BEAN_NAME_CONVETION_ADD + "!" + clazz.getName(); 
    } 
} 
+0

おかげで、答えはちょうどいくつかの質問、偉大に見えますか?代わりにMapの使用を含める理由は何ですか? AppName、ModuleNameおよびBeanNameはすべてのセッションBeanごとに異なります。これらをインスタンス変数としてインターフェイスに定義しました。ここでそれらをどのように定義すればうまくいくのか分かりません。特にAppNameとModuleName。 –

+0

地図は、リモートサービスを保存するためのもので、2度目の呼び出しで利用できるようになります。 'APP_NAME'、' MODULE_NAME'、 'BEAN_NAME_CONVETION_ADD'の定数は、すべてのセッションで生放送中は違いはありません。最初は' @ApplicationScoped'で注釈が付けられています。定数であるためです。 BEAN_NAME_CONVETION_ADDは、リモートサービスの実装に名前を追加する定数です。 'ServiceLookupUtil'クラスは、プロジェクトのobetenerリモートサービスのためだけです。 – Willy

関連する問題