cant it be done with mapped name? - Romain
2012/7/3 David Blevins <david.blev...@gmail.com> > > On Jul 1, 2012, at 5:11 PM, exabrial wrote: > > > Hey sorry to wake a dead thread... > > Preferred actually. Saves the time of having to dig for the old thread. > > > but I just thought of something: Does > > OpenEJB has a jndi-link feature? > > > > I don't think it does, but I know GlassFish and Resin can do it.... > > http://www.caucho.com/resin-3.0/config/env.xtp#jndi-link > > > > Would writing a custom ObjectFactory be the correct way to do this? > > > > In my frontend JSF application, in a servlet, say I had: > > > > @EJB > > MyService myService; > > > > If I wanted to link that EJB to an external context, I would put > something > > in TomEE.xml like this: > > > > <JndiProvider id="shoe" type="javax.naming.InitialContext"> > > java.naming.provider.url = ejbd://localhost:3201 > > java.naming.factory.initial = > > org.apache.openejb.client.RemoteInitialContextFactory > > </JndiProvider> > > > > <Resource id="MyService" > > type="org.apache.openejb.xxx.OpenEJBExternalJndiLink"> > > externalContext = "shoe" > > externalName="MyDeploymentId/MyService.Remote" > > </JndiProvider> > > Ignoring the <Resource> part for a moment, the best fit would likely be > something that allows you to describe the external EJB. > > The trick is when you use `@EJB` like shown above, the matching EJB is > resolved by type. The pseudo <Resource> declaration doesn't have the type > `MyService` in it anywhere and therefore wouldn't work. You'd be stuck > matching by string (id) and then what I mention before about needing to > change all your `@EJB` references to use `name` as in > `@EJB(name="MyService")` would still apply. > > So something that allows you to say, "I have an EJB of type X that you can > lookup via Y jndi name using Z <JndiProvider>" would be the most terse and > common-case solution. > > Being able to optionally specify the "ejb-name" so you could also match > with `@EJB(beanName="fooService")` would be nice. The `beanName` attribute > is used as a tie-breaker when there is more than one bean that could > satisfy an `@EJB` ref by type (e.g. say you have two beans that implement > the same @Remote interface, `@EJB` will no longer work unless you specify > `beanName`. > > Theoretically that could look something like: > > <ExternalEjb> > <interface>org.superbiz.MyService</interface> > <interface>org.superbiz.Foo</interface> > <bean-name>fooService</bean-name> > <jndi-name>FooService.Remote</jndi-name> > <jndi-provider>shoe</jndi-provider> > </ExternalEjb> > > Not crazy about the ExternalEjb element name, but that's the basic idea. > To recap: > > - @EJB is resolved by either `type` or `beanName` > - if we can provide a way to tie either a type or a bean-name to an > external ejb, we're good. > > So what we'd do is take these ExternalEjb refs and add them into the mix > when we run our "find the matching EJB for this @EJB ref" logic. > > Since we allow you to declare the actual server info in <JndiProvider>, > you could potentially do all this in code if we were to create an > equivalent annotation. Maybe something like: > > public @interface ExternalEjb { > Class[] interfaces() default {}; > String beanName() default ""; > String jndiName() default ""; > String jndiProvider() default ""; > } > > We could maybe allow you to specify that on a class or something. Or > perhaps even more clever: > > @ExternalEjb(jndiName = "FooService.Remote", jndiProvider = "shoe") > public abstract class FooService implements MyService, Foo {} > > At this point you have far less XML to maintain and having 1 to 100+ of > these external ejbs would be pretty easy as you'd only need to keep a > single `<JndiProvider id="shoe">` entry up-to-date. > > Thoughts? > > > -David > >