Search code examples
jakarta-eejboss7.xjndi

Find out global jndi name from within bean


I have multiple JavaEE6 applications (.war) deployed in a JBoss 7.4. All of these applications contain a common library which provides a Singleton-Bean implementation. This singleton-bean is configured differently for each application using the JBoss modules folder and should log some application specific information - This is working already fine.

However I have difficulties distinguishing which log line comes from which application.

When the server starts for each application (my-app1, my-app2, ...) I have the following output in the log:

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

This output is exactly what I need, so I would like to retrieve the global jndi name under which MyBean was deployed in my code:

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
    }

}

When researching this I only find vast information on how to lookup beans via jndi, which I don't need. Can I extract the app-name somehow via creating a new InitialContext()?


Solution

  • I found how to lookup the name. It is available via jndi-lookup under the name java:app/AppName or java:module/ModuleName.

    I extended my EJB as follows:

    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
        }
    
    }