2016-06-15 2 views
0

JBoss 7.4에 여러 JavaEE6 응용 프로그램 (.war)이 배포되었습니다. 이러한 응용 프로그램에는 모두 Singleton-Bean 구현을 제공하는 공통 라이브러리가 포함되어 있습니다. 이 싱글 톤 빈은 JBoss 모듈 폴더를 사용하는 각 응용 프로그램마다 다르게 구성되며 일부 응용 프로그램 관련 정보를 기록해야합니다. 이는 이미 정상적으로 작동하고 있습니다.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 

이 출력은 내가 필요 정확히, 그래서 에서 myBean이 내 코드에 배포 된 아래의 글로벌 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 
    } 

} 

난 단지 내가 필요하지 않은 JNDI를 통해 콩을 조회하는 방법에 대한 방대한 정보를 찾을 수이 연구. 어떻게하면 new InitialContext()을 만들어서 앱 이름을 추출 할 수 있습니까?

답변

0

이름을 찾는 방법을 찾았습니다. jndi-lookup을 통해 java:app/AppName 또는 java:module/ModuleName이라는 이름으로 사용할 수 있습니다. 이 내 솔루션입니다

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

다음과 같이

나는 내 EJB를 확장했다. –

+0

추가 종속성 : \t'코드 \t \t \t net.sf.extcos \t \t \t extcos \t \t \t 0.4b \t \t' –

관련 문제