tomee-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From David Sells <dse...@gmail.com>
Subject Re: JNDI EJB Lookup and OpenEJB Loader Application
Date Wed, 22 Jul 2009 19:41:47 GMT
Wow!

What an answer ( to my question and the ones I was just about to ask) and it
works.

Thanks, David

On Wed, Jul 22, 2009 at 2:27 PM, David Blevins <david.blevins@visi.com>wrote:

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

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message