0
votes

I am trying to connect to a Remote EJB that is deployed in a JBoss 7 Server. I tried to figure out what the JNDI name is by looking at the JNDI dump that I got from the JBoss CLI.
No matter what I try I cannot lookup the EJB.

I think that the jndi name should be: java:global/XNet/api/ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote

Here is the client that I am using:

package com.mycompany.mavenproject1;

import com.mycompany.receiving.api.ReceivingAPI_EJBRemote;
import com.mycompany.receiving.api.ReceivingAPI;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Properties;
/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args ) throws NamingException
    {
        System.out.println( "Hello World!" );


        //ReceivingAPI ejbRemote = DomainHelper.getHQApi(com.mycompany.receiving.api.ReceivingAPI.class);
        ReceivingAPI_EJBRemote ejbRemote = App.lookupRemoteStatelessCalculator();

        ejbRemote.getOpenRcvdocForSite(null, 7);
    }

//    private static ReceivingAPI_EJBRemote lookupRemoteStatelessReceiving() throws NamingException {
//        
//    }
//    
    private static ReceivingAPI_EJBRemote lookupRemoteStatelessCalculator() throws NamingException {
        final Properties jndiProperties = new Properties();
        jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
        jndiProperties.put(Context.PROVIDER_URL,"remote://someserver.xmx.com:1199");
        // username
        jndiProperties.put(Context.SECURITY_PRINCIPAL, "mycompany1");
        // password
        jndiProperties.put(Context.SECURITY_CREDENTIALS, "<removed>");
        //final Context context = new InitialContext(jndiProperties);


        jndiProperties.put("jboss.naming.client.ejb.context", true);

        InitialContext context = new InitialContext( jndiProperties );
        // The app name is the application name of the deployed EJBs. This is typically the ear name
        // without the .ear suffix. However, the application name could be overridden in the application.xml of the
        // EJB deployment on the server.
        // Since we haven't deployed the application as a .ear, the app name for us will be an empty string
        final String appName = "XNet";
        // This is the module name of the deployed EJBs on the server. This is typically the jar name of the
        // EJB deployment, without the .jar suffix, but can be overridden via the ejb-jar.xml
        // In this example, we have deployed the EJBs in a jboss-as-ejb-remote-app.jar, so the module name is
        // jboss-as-ejb-remote-app
        final String moduleName = "api";
        // AS7 allows each deployment to have an (optional) distinct name. We haven't specified a distinct name for
        // our EJB deployment, so this is an empty string
        final String distinctName = "hq";
        // The EJB name which by default is the simple class name of the bean implementation class
        final String beanName = com.mycompany.receiving.api.ReceivingAPI.class.getSimpleName();
        // the remote view fully qualified class name
        final String viewClassName = ReceivingAPI_EJBRemote.class.getName();
        // let's do the lookup

        try {
            ReceivingAPI test1 = (ReceivingAPI)context.lookup("java:global/XNet/api/" + beanName + "_EJB!" + viewClassName);
            System.out.println("Test1 = " + test1.getClass().getName());
        } catch(Throwable t) {
          System.out.println(t);  
        }

        try {
            ReceivingAPI test = (ReceivingAPI)context.lookup("java:global/XNet/api/hq/" + beanName + "_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote");
            System.out.println("Test = " + test.getClass().getName());
        } catch(Throwable t) {
            System.out.println(t);
        }

        try {
            ReceivingAPI test = (ReceivingAPI)context.lookup("ejb:XNet/api/hq/" + beanName + "_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote");
            System.out.println("Test = " + test.getClass().getName());
        } catch(Throwable t) {
            System.out.println(t);
        }
        return (ReceivingAPI_EJBRemote) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "_EJB!" + viewClassName);
    }

}

The output from the run of the previous java class:

Hello World!
javax.naming.NameNotFoundException: global/XNet/api/ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote -- service jboss.naming.context.java.jboss.exported.global.XNet.api."ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote"
javax.naming.NameNotFoundException: global/XNet/api/hq/ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote -- service jboss.naming.context.java.jboss.exported.global.XNet.api.hq."ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote"
javax.naming.NameNotFoundException: ejb:XNet/api/hq/ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote -- service jboss.naming.context.java.jboss.exported.ejb:XNet.api.hq."ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote"
Exception in thread "main" javax.naming.NameNotFoundException: ejb:XNet/api/hq/ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote -- service jboss.naming.context.java.jboss.exported.ejb:XNet.api.hq."ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote"
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)
    at org.jboss.naming.remote.protocol.v1.Protocol$1.handleServerMessage(Protocol.java:127)
    at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever$1.run(RemoteNamingServerV1.java:73)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

Here is the dump of the JNDI CLI Command:

[jboss1@hmudev01 bin]$ ./jboss-cli.sh --connect controller=localhost:10099
[standalone@localhost:10099 /] /subsystem=naming:jndi-view
{
    "outcome" => "success",
    "result" => {
        "java: contexts" => {
            "java:global" => {
                "XNet" => {
                    "class-name" => "javax.naming.Context",
                    "children" => {
                        "api" => {
                            "class-name" => "javax.naming.Context",
                            "children" => {
                                "ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBLocal" => {
                                    "class-name" => "com.mycompany.receiving.api.ReceivingAPI_EJBLocal$$$view46",
                                    "value" => "Proxy for view class: com.mycompany.receiving.api.ReceivingAPI_EJBLocal of EJB: ReceivingAPI_EJB"
                                },
                                "ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote" => {
                                    "class-name" => "com.sun.proxy.$Proxy272",
                                    "value" => "Proxy for remote EJB StatelessEJBLocator{appName='XNet', moduleName='api', distinctName='hq', beanName='ReceivingAPI_EJB', view='interface com.mycompany.receiving.api.ReceivingAPI_EJBRemote'}"
                                },
                            }
                        }
                    }
                }
            }
        }

        ...
    }
}
[standalone@localhost:10099 /] 

Any my maven deps are as follows:

 <dependencies>
    <dependency>
        <groupId>com.mycompany.receiving</groupId>
        <artifactId>xnet-domain-receiving-client</artifactId>
        <version>2.5.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.as</groupId>
        <artifactId>jboss-as-naming</artifactId>
        <version>7.1.3.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.marshalling</groupId>
        <artifactId>jboss-marshalling-river</artifactId>
        <version>1.4.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.client</groupId>
        <artifactId>jbossall-client</artifactId>
        <version>5.0.0.GA</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.spec.javax.ejb</groupId>
        <artifactId>jboss-ejb-api_3.1_spec</artifactId>
        <version>1.0.2.Final</version>
    </dependency>
</dependencies>
1
For a remote lookup i think you can do away with anything global related as it'll be ejb: that you're after. Having said that, i think your lookup strings are a bit funky. It should be something like ejb:<app_name>/<bean_name>!<bean_interface>. This will change slightly if you're deployed in an .earRhys
So in your case, I think (assuming RNet is the name of your .jar) the String you're after is ejb:RNet/ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBLocal (note the lack of java:ejb). It looks like you're pushing in some non-standard ports into your jndi setup as well, assuming that's intentional. If that doesn't work, might want to look at jndiProps next.Rhys
Rhys you were mostly right but it gave the ability to figure out what I needed to do. I will post it in the answer.Scott Lewis

1 Answers

0
votes

In the comment above Rhys was right about the jndi string looking "funky". I tried everything I thought. Here is what worked for my situation.

The JNDI URL needs to look like this:

XNet/api/ReceivingAPI_EJB!com.mycompany.receiving.api.ReceivingAPI_EJBRemote

I also had to add add a dependency to the others shown in the question:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
    </dependency>