2016-06-15 23 views
0

私はJBoss 7.4に複数のJavaEE6アプリケーション(.war)をデプロイしています。 これらのアプリケーションにはすべて、シングルトンBeanの実装を提供する共通ライブラリが含まれています。 このシングルトンBeanは、JBoss modulesフォルダを使用してアプリケーションごとに異なる設定がされており、アプリケーション固有の情報をログに記録する必要があります。bean内のグローバルjndi名を調べる

しかし、どのアプリケーションがどのログ・ラインから来るのかを区別するのは難しいです。

サーバは、アプリケーションごとに開始します(私の-APP1、私-APP2、...)私は、ログに次の出力を持っている場合:

INFO 10:45:54,998 (EjbJndiBindingsDeploymentUnitProcessor.java:setupJNDIBindings:183) -JNDI bindings for session bean named MyBean in deployment unit deployment "my-app1.war" are as follows: 
java:global/my-app1/MyBean!my.package.MyBean 
java:app/my-app1/MyBean!my.package.MyBean 
java:module/MyBean!my.package.MyBean 
java:global/my-app1/MyBean 
java:app/my-app1/MyBean 
java:module/MyBean 

この出力は私が必要とする正確に何であるので、I私は、私は必要としない、JNDI経由で豆をルックアップする方法についての膨大な情報を、見つけ、これを研究すると

import javax.annotation.PostConstruct; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 

import org.apache.log4j.Logger; 

@Singleton 
@Startup 
public class MyBean { 

    private static final Logger log = Logger.getLogger(MyBean.class); 

    @PostConstruct 
    private void postConstruct() { 
     String appName = ""; // .getGlobalJndiNameOfThisInstance(); 
     log.info("MyBean available for application " + appName); 
     // and log further application specific info 
    } 

} 

:MyBeanとは、自分のコードに展開された時のグローバルJNDI名を取得したいと思います。どういうわけかnew InitialContext()を作成してapp-nameを抽出できますか?

答えて

0

名前の検索方法が見つかりました。これは、java:app/AppNameまたはjava:module/ModuleNameの名前でjndi-lookupで利用できます。

次のように私は私のEJBを拡張:

import javax.annotation.PostConstruct; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 

import org.apache.log4j.Logger; 

@Singleton 
@Startup 
public class MyBean { 

    @Resource(lookup = "java:app/AppName") 
    String appName; 

    private static final Logger log = Logger.getLogger(MyBean.class); 

    @PostConstruct 
    private void postConstruct() { 
     log.info("MyBean available for application " + appName); 
     // and log further application specific info 
    } 

} 
0
import java.net.URL; 
import java.util.*; 
import javax.ejb.Stateless; 
import javax.naming.*; 
import net.sf.extcos.ComponentQuery; 
import net.sf.extcos.ComponentScanner; 

public class ServiceLocator { 

public <T extends Object> T lookup(Class<T> interfaceLocal) { 
    try { 
     return (T) getInitialContext().lookup(buildJNDIWildfly(interfaceLocal)); 
    } catch (NamingException e) { 
     throw new RuntimeException(e); 
    } 
} 

public <T> String buildJNDIWildfly(final Class<T> interfaceLocal) { 
    Class<? extends T> clazz = getImplementorOf(interfaceLocal, getPackagesToScan()); 
    if (clazz != null) { 
     URL url = getUrlOfClass(clazz); 
     String module = getModuleName(url); 
     return "global/" + module + "/" + clazz.getSimpleName() + "!" + interfaceLocal.getName(); 
    } 
    return null; 
} 

public String[] getPackagesToScan() { 
    // important to reduce range of search 
    return new String[] { "my.package.of.ejbs" }; 
} 

public static URL getUrlOfClass(Class<?> clazz) { 
    if (clazz == null) { 
     throw new NullPointerException(); 
    } 
    String resourceName = clazz.getName().replace('.', '/') + ".class"; 
    ClassLoader classLoader = clazz.getClassLoader(); 
    if (classLoader == null) { 
     classLoader = ClassLoader.getSystemClassLoader(); 
    } 
    return classLoader.getResource(resourceName); 
} 

public <T> Class<? extends T> getImplementorOf(final Class<T> interfaceLocal, final String... packagesToScan) { 
    // https://sourceforge.net/projects/extcos 
    final Set<Class<?>> classes = new HashSet<Class<?>>(); 
    ComponentScanner scanner = new ComponentScanner(); 
    scanner.getClasses(new ComponentQuery() { 
     @Override 
     protected void query() { 
      select().from(packagesToScan).andStore(
        thoseBeing(and(annotatedWith(Stateless.class), implementorOf(interfaceLocal))).into(classes)) 
        .returning(none()); 
     } 
    }); 
    if (classes.size() > 0) { 
     return (Class<? extends T>) classes.iterator().next(); 
    } else { 
     return null; 
    } 
} 

private String getModuleName(URL urlOfClass) { 
    if (urlOfClass != null) { 
     // Ex: 
     // vfs:/opt/jboss-eap-6.4/standalone/deployments/myEar.ear/my-module.jar/my/interface/local/MyInterface.class 
     String filePath = urlOfClass.getFile(); 
     int earPosition = filePath.lastIndexOf(".ear"); 
     int jarPosition = filePath.lastIndexOf(".jar"); 
     String earName = null; 
     String moduleName = null; 
     if (earPosition >= 0) { 
      earName = filePath.substring(filePath.lastIndexOf('/', earPosition) + 1, earPosition); 
     } 
     if (jarPosition >= 0) { 
      moduleName = filePath.substring(filePath.lastIndexOf('/', jarPosition) + 1, jarPosition); 
      if (earName != null) { 
       moduleName = earName + "/" + moduleName; 
      } 
     } 
     return moduleName; 
    } 

    return null; 
} 

private InitialContext getInitialContext() { 
    try { 

     Hashtable<String, String> props = new Hashtable<String, String>(); 
     props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
     return new InitialContext(props); 
    } catch (NamingException e) { 
     throw new RuntimeException(e); 
    } 
} 
} 
+0

を、これは私のソリューションです。 –

+0

追加依存:\t 'コード \t \t \t net.sf.extcos \t \t \t extcos \t \t \t 0.4b \t \t' –

関連する問題