Search code examples
javajbossejbejb-3.0jboss5.x

I can't setup my jndi.properties to access remote EJBs on Jboss 5


I'm trying to setup the Jboss server "client" (version 5.1.0) to use remote EJBs from another Jboss server (10.90.0.91), but I can't do this using a jndi.properties file on the Jboss client.

I can get the remote EJB using this simple code on my client:

        InitialContext ctx = null;
        try {
            Hashtable<String, String> jndiProps = new Hashtable<String, String>();
            jndiProps.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
            jndiProps.put(InitialContext.PROVIDER_URL, "jnp://10.90.0.91:1099");
            ctx = new InitialContext(jndiProps);
            return ctx.lookup(jndiName);
        } catch (NamingException e) {
            throw new RuntimeException(e);
        }

This works fine.

Now I would like to setup the Jboss client with this properties. But if I edit the existent jndi.properties file localized on server/{application}/conf/ from:

# DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOU ARE DOING
#
java.naming.factory.initial=org.jboss.iiop.naming.ORBInitialContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

To:

# DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOU ARE DOING
#
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://10.90.0.91:1099

I receive some errors when I start the Jboss client (apparently, I don't know what I'm doing :)):

2016-08-19 10:17:41,645 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Start: name=HASessionStateService state=Create
javax.naming.NameAlreadyBoundException: Default
    at org.jnp.server.NamingServer.bind(NamingServer.java:209)
    at org.jnp.server.NamingServer.bind(NamingServer.java:167)
[...]

2016-08-19 10:17:42,767 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Start: name=ProfileServiceProxyFactory state=Create
javax.naming.NameAlreadyBoundException: ProfileService
    at org.jnp.server.NamingServer.bind(NamingServer.java:209)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[...]

2016-08-19 10:17:44,778 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Start: name=jboss:service=ClientUserTransaction state=Create mode=Manual requiredState=Installed
javax.naming.NameAlreadyBoundException: UserTransaction
    at org.jnp.server.NamingServer.bind(NamingServer.java:209)
    at sun.reflect.GeneratedMethodAccessor487.invoke(Unknown Source)
[...]

And in the final:

2016-08-19 10:17:51,993 ERROR [org.jboss.system.server.profileservice.ProfileServiceBootstrap] (main) Failed to load profile: Summary of incomplete deployments (SEE PREVIOUS ERRORS FOR DETAILS):

DEPLOYMENTS MISSING DEPENDENCIES:
  Deployment "ProfileServiceInvocationHandler" is missing the following dependencies:
    Dependency "ProfileServiceProxyFactory" (should be in state "Configured", but is actually in state "**ERROR**")
    Dependency "ProfileServiceProxyFactory" (should be in state "Configured", but is actually in state "**ERROR**")

DEPLOYMENTS IN ERROR:
  Deployment "jboss:service=ClientUserTransaction" is in error due to the following reason(s): javax.naming.NameAlreadyBoundException: UserTransaction
  Deployment "HASessionStateService" is in error due to the following reason(s): javax.naming.NameAlreadyBoundException: Default
  Deployment "ProfileServiceProxyFactory" is in error due to the following reason(s): javax.naming.NameAlreadyBoundException: ProfileService, **ERROR**

So, I think I can't touch in already existent JNDI properties on that file.

If the jndi.properties file can't be changed because it is being used by JBoss itself, in which location can I set my JNDI lookup settings to the remote EJBs within the Jboss 5? How can I configure a jndi.properties file to be available in the application classpath without put the jndi.properties file inside of my WAR file?

Thanks!


Solution

  • An alternative way to do this is to configure a org.jboss.naming.ExternalContext MBean in your jboss-service.xml file:

    <mbean code="org.jboss.naming.ExternalContext" 
           name="jboss.jndi:service=ExternalContext,jndiName=external/server2">
        <attribute name="JndiName">external/server2</attribute>
        <attribute name="Properties">
            java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
            java.naming.provider.url=jnp://10.90.0.91:1099
            <!-- other properties as needed -->
        </attribute>
        <attribute name="InitialContext"> javax.naming.IntialContext </attribute>
        <attribute name="RemoteAccess">false</attribute>
    </mbean>
    

    Your java code to perform the lookup then becomes:

     Context initialContext = new InitialContext();
     return initialContext.lookup("external/server2/" + jndiName);
    

    You can even navigate the remote JNDI tree using JNDIView in the local management console when you set this up.

    More information can be found in org.jboss.naming.ExternalContext MBean.