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();
}
}
おかげで、答えはちょうどいくつかの質問、偉大に見えますか?代わりにMapの使用を含める理由は何ですか? AppName、ModuleNameおよびBeanNameはすべてのセッションBeanごとに異なります。これらをインスタンス変数としてインターフェイスに定義しました。ここでそれらをどのように定義すればうまくいくのか分かりません。特にAppNameとModuleName。 –
地図は、リモートサービスを保存するためのもので、2度目の呼び出しで利用できるようになります。 'APP_NAME'、' MODULE_NAME'、 'BEAN_NAME_CONVETION_ADD'の定数は、すべてのセッションで生放送中は違いはありません。最初は' @ApplicationScoped'で注釈が付けられています。定数であるためです。 BEAN_NAME_CONVETION_ADDは、リモートサービスの実装に名前を追加する定数です。 'ServiceLookupUtil'クラスは、プロジェクトのobetenerリモートサービスのためだけです。 – Willy