Uploaded image for project: 'Application Server 7'
  1. Application Server 7
  2. AS7-2138

javax.naming.NameNotFoundException: rmi://127.0.0.1:1090/jmxrmi thrown when creating MBeanServerConnection

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • 7.1.2.Final (EAP)
    • 7.0.0.Final, 7.0.1.Final, 7.0.2.Final, 7.1.0.Final
    • JMX
    • None
    • Hide

      Deploy attached jmx-test.jar, or use the attached 'JMXConnectionBean.java' to create one yourself.

      Show
      Deploy attached jmx-test.jar, or use the attached 'JMXConnectionBean.java' to create one yourself.
    • Workaround Exists
    • Hide
      Connector.java
      JMXConnector connector = null;
              MBeanServerConnection connection = null;
              try {
                  String urlString = "service:jmx:rmi:///jndi/rmi://localhost:1090/jmxrmi";
                  JMXServiceURL serviceURL = new JMXServiceURL(urlString);
                  Map<String, String> env = new HashMap<String, String>();
                  env.put(InitialContext.INITIAL_CONTEXT_FACTORY, RMIContextFactory.class.getName());
                  connector = JMXConnectorFactory.connect(serviceURL, env);
                  connection = connector.getMBeanServerConnection();
              } finally {
                  if (connector != null) {
                     connector.close();
                  }
              }
      
      
      
      RMIContextFactory.java
      import java.util.Hashtable;
      
      import javax.naming.Context;
      import javax.naming.NamingException;
      import javax.naming.spi.InitialContextFactory;
      
      import com.sun.jndi.url.rmi.rmiURLContext;
      
      
      public class RMIContextFactory implements InitialContextFactory{
      
          /* (non-Javadoc)
           * @see javax.naming.spi.InitialContextFactory#getInitialContext(java.util.Hashtable)
           */
          @Override
          public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
              return new rmiURLContext(environment);
          }
      
      }
      

      Also this will require small modification of sun.jdk module, to export 'com.sun.jndi.url.rmi' path(or you will have to provide your own impl of rmiContext ), since by default this module exports 'com.sun.jndi.url' and 'com.sun.jndi.url.ldap', iirc.
      So, edit: jboss-as/build/src/main/resources/modules/sun/jdk/main/main.xml and one statement: <path name="com/sun/jndi/url/rmi"/>, it should look like this:

      <module xmlns="urn:jboss:module:1.1" name="sun.jdk">
          <resources>
              <!-- currently jboss modules has not way of importing services from
              classes.jar so we duplicate them here -->
              <resource-root path="service-loader-resources"/>
          </resources>
          <dependencies>
              <system export="true">
                  <paths>
                      <path name="com/sun/script/javascript"/>
                      <path name="com/sun/jndi/dns"/>
                      <path name="com/sun/jndi/ldap"/>
                      <path name="com/sun/jndi/url"/>
      		<path name="com/sun/jndi/url/rmi"/>
                      <path name="com/sun/jndi/url/dns"/>
                      <path name="com/sun/security/auth"/>
                      <path name="com/sun/security/auth/login"/>
                      <path name="com/sun/security/auth/module"/>
                      <path name="sun/misc"/>
                      <path name="sun/io"/>
                      <path name="sun/nio"/>
                      <path name="sun/nio/ch"/>
                      <path name="sun/security"/>
                      <path name="sun/security/krb5"/>
                      <path name="sun/util"/>
                      <path name="sun/util/calendar"/>
                      <path name="sun/security/provider"/>
                      <path name="META-INF/services"/>
                  </paths>
                  <exports>
                      <include-set>
                          <path name="META-INF/services"/>
                      </include-set>
                  </exports>
              </system>
          </dependencies>
      </module>
      

      Now NOTE: this will make that initial context to be usable ONLY for RMI lookups.

      Show
      Connector.java JMXConnector connector = null ; MBeanServerConnection connection = null ; try { String urlString = "service:jmx:rmi: ///jndi/rmi://localhost:1090/jmxrmi" ; JMXServiceURL serviceURL = new JMXServiceURL(urlString); Map< String , String > env = new HashMap< String , String >(); env.put(InitialContext.INITIAL_CONTEXT_FACTORY, RMIContextFactory. class. getName()); connector = JMXConnectorFactory.connect(serviceURL, env); connection = connector.getMBeanServerConnection(); } finally { if (connector != null ) { connector.close(); } } RMIContextFactory.java import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.spi.InitialContextFactory; import com.sun.jndi.url.rmi.rmiURLContext; public class RMIContextFactory implements InitialContextFactory{ /* (non-Javadoc) * @see javax.naming.spi.InitialContextFactory#getInitialContext(java.util.Hashtable) */ @Override public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException { return new rmiURLContext(environment); } } Also this will require small modification of sun.jdk module, to export 'com.sun.jndi.url.rmi' path(or you will have to provide your own impl of rmiContext ), since by default this module exports 'com.sun.jndi.url' and 'com.sun.jndi.url.ldap', iirc. So, edit: jboss-as/build/src/main/resources/modules/sun/jdk/main/main.xml and one statement: <path name="com/sun/jndi/url/rmi"/> , it should look like this: <module xmlns= "urn:jboss:module:1.1" name= "sun.jdk" > <resources> <!-- currently jboss modules has not way of importing services from classes.jar so we duplicate them here --> <resource-root path= "service-loader-resources" /> </resources> <dependencies> <system export= "true" > <paths> <path name= "com/sun/script/javascript" /> <path name= "com/sun/jndi/dns" /> <path name= "com/sun/jndi/ldap" /> <path name= "com/sun/jndi/url" /> <path name= "com/sun/jndi/url/rmi" /> <path name= "com/sun/jndi/url/dns" /> <path name= "com/sun/security/auth" /> <path name= "com/sun/security/auth/login" /> <path name= "com/sun/security/auth/module" /> <path name= "sun/misc" /> <path name= "sun/io" /> <path name= "sun/nio" /> <path name= "sun/nio/ch" /> <path name= "sun/security" /> <path name= "sun/security/krb5" /> <path name= "sun/util" /> <path name= "sun/util/calendar" /> <path name= "sun/security/provider" /> <path name= "META-INF/services" /> </paths> <exports> <include-set> <path name= "META-INF/services" /> </include-set> </exports> </system> </dependencies> </module> Now NOTE: this will make that initial context to be usable ONLY for RMI lookups.

      When trying to create a MBeanServerConnection from within an EJB a "javax.naming.NameNotFoundException" is thrown. When executed as a standalone Java the same code works fine. To verify that it works as a standalone Java process run "java -cp jmx-test.jar com.example.JMXConnectionBean" (with AS7 running on the same machine).

      Full stack trace:

       
      Caused by: java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.NameNotFoundException: rmi://127.0.0.1:1090/jmxrmi -- service jboss.naming.context.java.rmi:."127.0.0.1:1090".jmxrmi
      	at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:340) [:1.6.0_26]
      	at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:248) [:1.6.0_26]
      	at com.example.JMXConnectionBean.init(JMXConnectionBean.java:28)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_26]
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_26]
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_26]
      	at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_26]
      	at org.jboss.as.ee.component.ManagedReferenceLifecycleMethodInterceptor.processInvocation(ManagedReferenceLifecycleMethodInterceptor.java:70)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
      	at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
      	at org.jboss.as.ee.component.ManagedReferenceInterceptor.processInvocation(ManagedReferenceInterceptor.java:53)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
      	at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
      	at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:44)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
      	at org.jboss.as.ejb3.component.session.SessionInvocationContextInterceptor$CustomSessionInvocationContext.proceed(SessionInvocationContextInterceptor.java:126)
      	at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:211)
      	at org.jboss.as.ejb3.tx.CMTTxInterceptor.requiresNew(CMTTxInterceptor.java:313)
      	at org.jboss.as.ejb3.tx.SingletonLifecycleCMTTxInterceptor.processInvocation(SingletonLifecycleCMTTxInterceptor.java:56)
      	at org.jboss.as.ejb3.tx.SingletonLifecycleCMTTxInterceptor.processInvocation(SingletonLifecycleCMTTxInterceptor.java:42)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
      	at org.jboss.as.ejb3.component.session.SessionInvocationContextInterceptor.processInvocation(SessionInvocationContextInterceptor.java:71)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
      	at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45)
      	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
      	at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
      	at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:152)
      	... 9 more
      Caused by: javax.naming.NameNotFoundException: rmi://127.0.0.1:1090/jmxrmi -- service jboss.naming.context.java.rmi:."127.0.0.1:1090".jmxrmi
      	at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:87)
      	at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:173)
      	at org.jboss.as.naming.InitialContext.lookup(InitialContext.java:47)
      	at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:209)
      	at javax.naming.InitialContext.lookup(InitialContext.java:392) [:1.6.0_26]
      	at javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnector.java:1888) [:1.6.0_26]
      	at javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.java:1858) [:1.6.0_26]
      	at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:257) [:1.6.0_26]
      	... 37 more
      

        1. jmx-test.jar
          2 kB
        2. JmxServer.java
          0.7 kB
        3. JMXConnectionBean.java
          1.0 kB
        4. JmxClient.java
          0.7 kB

              rhn-cservice-bbaranow Bartosz Baranowski
              sthorger@redhat.com Stian Thorgersen
              Votes:
              5 Vote for this issue
              Watchers:
              14 Start watching this issue

                Created:
                Updated:
                Resolved: