You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomee.apache.org by David Blevins <da...@visi.com> on 2007/08/14 02:04:36 UTC
JNDI Name defaults
So one of the remaining issues for the 3.0 release is the JNDI name
strategy we're going to use. I had totally thought this was all
straightened out when I added the TemplatedStrategy (documented here:
http://openejb.apache.org/jndi-names.html), but it turns out we are
still using the LegacyAddedSuffixStrategy by default so the
documentation in that page also isn't right by default :)
I recall not switching us over by default as we have the huge itest
which all use the LegacyAddedSuffixStrategy. Really, it should be
fine as each app should be able to use the strategy they want (maybe
even put a strategy implementation class in their jar).
So we need to get the default switched over to the new
TemplatedStrategy as it's the most powerful by far. As well we
should probably provide a way provide a way for individual apps to
specify which strategy they'd like via the openejb-jar.xml file or
something.
Going to try and plumb something in. Thinking the first steps maybe
to eliminate the JndiNameStrategy.Interface enum and use the top-
level o.a.o.InterfaceType enum. Also thinking we would be better off
if the TempalatedStrategy could support the
LegacyAddedSuffixStrategy, which it can't at the moment.
Once we get the default working as documented with the
TemplatedStrategy, we should probably switch over our examples to use
the new names.
-David
Re: JNDI Name defaults
Posted by Karan Malhi <ka...@gmail.com>.
Had to read [1],[2],[3],[4],[5] and your email twice ;). Its pretty clear.
On 8/13/07, David Blevins <da...@visi.com> wrote:
>
> So one of the remaining issues for the 3.0 release is the JNDI name
> strategy we're going to use. I had totally thought this was all
> straightened out when I added the TemplatedStrategy (documented here:
> http://openejb.apache.org/jndi-names.html), but it turns out we are
> still using the LegacyAddedSuffixStrategy by default so the
> documentation in that page also isn't right by default :)
>
> I recall not switching us over by default as we have the huge itest
> which all use the LegacyAddedSuffixStrategy. Really, it should be
> fine as each app should be able to use the strategy they want (maybe
> even put a strategy implementation class in their jar).
>
> So we need to get the default switched over to the new
> TemplatedStrategy as it's the most powerful by far. As well we
> should probably provide a way provide a way for individual apps to
> specify which strategy they'd like via the openejb-jar.xml file or
> something.
>
> Going to try and plumb something in. Thinking the first steps maybe
> to eliminate the JndiNameStrategy.Interface enum and use the top-
> level o.a.o.InterfaceType enum. Also thinking we would be better off
> if the TempalatedStrategy could support the
> LegacyAddedSuffixStrategy, which it can't at the moment.
>
> Once we get the default working as documented with the
> TemplatedStrategy, we should probably switch over our examples to use
> the new names.
>
> -David
>
>
--
Karan Singh Malhi
Re: JNDI Name defaults
Posted by David Blevins <da...@visi.com>.
On Aug 13, 2007, at 5:04 PM, David Blevins wrote:
> One of the remaining issues for the 3.0 release is the JNDI name
> strategy we're going to use. I had totally thought this was all
> straightened out when I added the TemplatedStrategy (documented
> here: http://openejb.apache.org/jndi-names.html), but it turns out
> we are still using the LegacyAddedSuffixStrategy by default so the
> documentation in that page also isn't right by default :)
More on the jndi name issue as it relates to proxies.
You may recall our discussions[1][2][3] on what do to about all-in-
one proxies and the fact that some spec compliant beans may have
business interfaces that conflict[4] and therefore can't be all-in-
one proxies requiring us to also support a one-proxy-per-interface
approach.
What we ended up with is for each bean we create an all-in-one proxy
and bind it into jndi, then for each of that bean's business
interfaces we create a proxy with just that interface in it (the one-
proxy-per-interface approach) and bind each proxy into jndi as well.
So a bean with four remote business interfaces, for example, gets 1
all-in-one "business remote" proxy and 4 single-interface proxies,
one for each remote business interface. The same algorithm would
apply to local business interfaces. We still do not support an all-
in-one proxy that implements both local business interfaces and
remote business interfaces.
This is the part that has changed. *Now* we no longer have two
separate approaches (all-in-one-proxy vs single-interface-proxy) we
have a sort of hybrid approach. In the new approach we still create
one proxy per each business interface, but we *also* include all the
other business interfaces implemented by the bean class provided none
of them conflict. So a bean with four business interfaces gets 4
proxies, each possibly containing all four business interfaces.
Recap: each proxy has all the business interfaces your bean
implements (provided no conflicts are found), plus the interface the
proxy is dedicated to (regardless if the bean implemented it). We
create one such proxy for each business interface you have.
So what are these conflicts? Business interfaces extending
java.rmi.Remote. If you do not have any business interfaces
extending java.rmi.Remote *and* you implemented all your business
interfaces in your bean class, you are good to go and do not need to
be concerned; all your proxies will be guaranteed to be 'all in one'
proxies you can cast it to any of the other business interfaces of
the same type (type=local vs remote) that bean implements.
What's the deal with java.rmi.Remote? The specific issue with
java.rmi.Remote interfaces is that per spec rules many runtime
exceptions (container or connection related) are thrown to clients as
java.rmi.RemoteException which is not a runtime exception and must be
throwable via the proxy.
For example it's legal for a bean to implement two conflicting
methods such as these:
InterfaceA: void doIt() throws Foo;
InterfaceB: void doIt() throws RemoteException;
by leaving out exceptions from the throws clause that aren't declared
in both interfaces methods.
Implementation: void doIt(){}
This is fine for a bean class as it isn't going to need to throw
RemoteException. However if we create a proxy from these two
interfaces it will also wind up with a 'doIt(){}' method that cannot
throw RemoteException. This is very bad as the container does need
to throw RemoteException per spec rules to any business interfaces
extending java.rmi.Remote. If the container attempts to throw a
RemoteException from the proxies 'doIt(){}' method, it will result in
an UndeclaredThrowableException thrown by the VM. The only way to
guarantee the proxy has the 'doIt() throws RemoteException {}' method
of InterfaceB is to cut out InterfaceA when we create the proxy
dedicated to InterfaceB. When we create the proxy dedicated to
InterfaceA, InterfaceB is cut out.
Hope this helps describe how we deal with proxies and the strange
edge case that may occur.
The important thing to remember is that if you implement all your
business interfaces and do not use java.rmi.Remote, your life is
super easy.
The only real issue in all of this java.rmi.Remote business is if you
decide to use an openejb.jndiname.format[5] that results in you
getting one proxy per bean (format="{deploymentId}" for example) or
one "business remote" proxy per bean (format="{deploymentId}
{interfaceType}", my preference) instead of one proxy per each
interface of a bean (format={deploymentId}/
{interfaceClass.simpleName}, the default).
Wow, that took a lot to describe.... I'm not so sure if it came out
clearly. We definitely want to make sure we nail this chunk of
documentation and that we all understand how things work.
Is it coming out clear?
-David
[1] http://marc.info/?l=openejb-development&m=117636072115360&w=2
[2] http://marc.info/?l=openejb-user&m=117636204916491&w=2
[3] http://marc.info/?l=openejb-development&m=117661592616633&w=2
[4] http://openejb.apache.org/multiple-business-interface-hazzards.html
[5] http://openejb.apache.org/jndi-names.html