On Oct 1, 2006, at 11:16 AM, David Jencks wrote:
Dain has been working on a global jndi implementation that looks
really nice. However the deployment of bindings part of it has
brought up some long-festering architectural worries and perhaps we
are now in a position to deal with them in a systematic manner.
David Blevins pointed out to me a long time ago that one of the
core principles of openejb was that ejb containers should have
nothing transport specific attached to them. This was when I
installed a TSSBean reference in ejb containers to enable binding
ejbs into corba. I pointed out that letting the ejb container know
jndi-names and local-jndi-names had the same problem, and IIRC he
agreed that this was an architectural flaw. In any case,
intentionally or not, he convinced me that both the tssbean link
and the jndi names should not be attached to the ejb container. If
you install dain's global jndi stuff the jndi names now get
recycled up to 3 times: for the openejb proprietary jndi impl,
global jndi, and corba. The global jndi connector binding creates
a similar but worse problem for j2ca connectors, since it tries to
bind using only the "name" component of the abstract name, rather
than allowing a specific global jndi name, and AFAICT it doesn't
let you specify which connectors you want to bind.
I think for all of these situations a cleaner runtime solution is a
component that links the thing you want to bind and the binding
context, and includes the name(s) you want to bind under.
Currently this would I think have to be a gbean. This is what Dain
implemented for gbean bindings. So, I'm proposing that bindings
for connectors in global jndi, and ejbs in global jndi, corba, and
the openejb jndi, each be set up by gbeans, each holding the name
(s) to bind under and a reference to the object to be bound. This
part is pretty easy to write.
Slightly harder is deployment: setting up these gbeans. If we
modify our schemas this can be done using NamingBuilders: here they
won't be constructing the components jndi context but rather
exposing the component in various naming systems. I think the
really hard part is figuring out some xml that is manageable to
write and expresses the meaning clearly.
For connectors it's pretty easy, we can just have a repeating element
<global-jndi-name>foo</global-jndi-name>
For ejbs with the current 3 naming systems it's a bit harder. One
possibility would look something like this:
<jndi>
<global/>
<corba>
<tss-link>foo-tss</tss-link>
</corba>
<openejb/>
<remote-name>foo</remote-name>
<local-name>bar</local-name>
</jndi>
where the global, corba, and openejb elements indicate which naming
system to bind to and the names are supplied with remote-name and
local-name. A remote jndi would ignore the local-name elements.
You could have multiple jndi elements to get different bindings in
different naming systems.
To make this extensible the naming system elements would have to be
in a substitution group and extend an abstract element. The ones
we know about now could all be in the same namespace.
Thoughts?
There was a discussion on this in context of OpenEJB 3. It was short
and no real conclusion was made, but let me see if I can't dig it up.
-David
thanks
david jencks