Hi David.  Like the name :)

On Jul 22, 2009, at 9:46 AM, David Sells wrote:

I have been able
to lookup and invoke the calculator using a *standalone* program using the
following code:

Properties properties = new Properties();
properties .setProperty (Context .INITIAL_CONTEXT_FACTORY ,"org.apache.openejb.client.RemoteInitialContextFactory");
properties.setProperty(Context.PROVIDER_URL, "
http://127.0.0.1:8080/openejb/ejb/";);
InitialContext initialContext = new InitialContext(properties);
CalculatorRemote calculator = (CalculatorRemote)
initialContext.lookup("java:cal-1.0/CalculatorRemote");
result = cow.multiply(2, 333);

That's good code but I would remove the "java:" from the lookup url. The "java:" lookups on an InitialContex actually bypass the Context.INITIAL_CONTEXT_FACTORY and go instead to whomever owns the "java" url prefix as configured via Context.URL_PKG_PREFIXES which is set internally by containers. Long story short, when running in Tomcat, Tomcat owns "java" and your lookup is going there instead of to the RemoteInitialContextFactory.

Now I tried this same code inside a web application to see if it would work and it failed. This web application was running in the same instance of
tomcat that the EJB is deployed in.

So for the scenario where your client is running in the same vm where Tomcat/OpenEJB are running, then you can do this:

NON-WEBAPP CLIENT:

    Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
    InitialContext initialContext = new InitialContext(properties);

CalculatorRemote calculator = (CalculatorRemote) initialContext.lookup("cal-1.0/CalculatorRemote");

    result = calculator.multiply(2, 333);

WEBAPP CLIENT:

Or if your client is in a webapp, you can add an ejb ref to CalculatorRemote in your web.xml

    <ejb-ref>
      <ejb-ref-name>MyCalculator</ejb-ref-name>
      <remote>org.foo.CalculatorRemote</remote>
    </ejb-ref>

Then you can look up the bean anywhere in the webapp like so:

    InitialContext initialContext = new InitialContext();
CalculatorRemote calculator = (CalculatorRemote) initialContext.lookup("java:comp/env/MyCalculator");

SERVLET, FILTER, LISTENER, MANAGED BEAN:

Or if your client is a Servlet, Filter, Listener, ManagedBean or other Java EE injectable object, then you can really get terse declaring just an annotated field like so.

    @EJB
    private CalculatorRemote calculator;

Note, in the "WEBAPP CLIENT" scenario you can actually skip the xml declaration if you add this as a class annotation on any servlet in your webapp.

    @EJB(beanInterface = CalculatorRemote.class, name = "MyCalculator")
    public class MyServlet ... {

That has the same effect as declaring it in xml.


Hope this helps!


-David

Reply via email to