2016-06-15 1 views
0

У меня есть несколько приложений JavaEE6 (.war), развернутых в JBoss 7.4. Все эти приложения содержат общую библиотеку, которая обеспечивает реализацию Singleton-Bean. Этот singleton-bean настраивается по-разному для каждого приложения с помощью папки модулей JBoss и должен регистрировать некоторую конкретную информацию приложения. Это работает уже отлично.Найти глобальное имя jndi изнутри bean

Однако у меня есть трудности с различием того, какая строка журнала поступает из какого приложения.

При запуске сервера для каждого приложения (мой-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 

Этот вывод является именно то, что мне нужно, поэтому я хотел бы получить глобальное имя JNDI, под которым MyBean был развернут в моем коде:

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.

Я продлил свой 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' –

Смежные вопросы