I wish I had more time to reply more extensively right now.... a few
comments inline.
On May 27, 2008, at 1:32 PM, daniel_k wrote:
Hi David,
thanks for taking the time for this extensive and constructive
answer and
for clearing out some essential questions about the GBeans
architecture.
I'm not quite sure what you expect.
What I'm missing is the link between GBeans and the J2EE world, or,
a more
extensive chapter on that in the Geronimo documentation. From what
you're
saying I conclude GBeans were once intended as a rather internal
building
block for Geronimo, and not intended as the building blocks for
applications
that run "on" Geronimo.
Originally we wanted to build a really solid component framework
infrastructure and use that to implement a j2ee server. It took
longer than we expected :-), we've lost a lot of the original
contributors along the way, and there are some new ideas in the air.
- deployment of javaee apps will consist of translating the javaee
descriptors and associated geronimo plans to an "intermediate
language" of gbean configurations
But isn't there more potential in GBeans? I wouldn't mind building
my entire
applications as networks of GBeans. I don't see the necessity for
EJBs, JNDI
etc. either. But then there should be more information on how to
wrap and/or
address "traditional" Java/J2EE items in GBeans.
I can't say I'm thrilled with how jndi is used to back annotations in
javaee 5, but the ejbs are really pretty simple, easy to use, and
powerful for what you get out of them. If you need transactions I
can't really imagine a reason to do it without CMT and ejb3.
Concretely: I really need instructions on how to connect to a
datasource
from a GBean, and, preferably, without the circumstantial way
through an EJB
or web application, as you pointed out. If the idea was really to
make the
server "a bunch of components" and everything can be connected via
annotations to avoid fishing expiditions (which is indeed a
beautiful and
appropriate term), then why isn't my data pool already one of these
components, or, (if it is), why doesn't the hint page at the end of
the
wizard suggest
@map(gbean-whatever)
DataSource d;
or
@map(gbean-whatever)
ConnectionPool p;
instead of this circumstantial J2EE stuff?
It is possible to do what you want.... perhaps not quite as simply as
you would like. We don't have an actual datasource gbean, but you can
get the datasource (or other connection factory) by calling a method
on a gbean. In fact this is how the jndi implementation works: when
you look up your datasource, the jndi Reference object calls this
method on the gbean.
So, your gbean needs a gbean reference to the
ManagedConnectionFactoryWrapper gbean created as part of the db pool
deployment. So you'll have something like
//constructor injection
private final ManagedConnectionFactoryWrapper myDbPoolWrapper;
Then...
DataSource ds = (DataSource)myDbPoolWrapper.$getResource();
//also need to declare the gbean-reference in the gbean info, or use
an annotation.
(this is from memory so I hope I didn't make too many mistakes.
There's at least one example of this in the geronimo (not openejb)
timer code. However I think this code is unused so will probably be
removed soon)
In particular many people
find them too hard to write and use
Again, I really liked the concept for its striking simplicity when I
read
it. What you're saying about binding at activation time really hits
the
mark. Unfortunately, the "gbean info" construction with all its string
literals eats up a lot of the beauty of the concept in practice,
especially
of the safety that is achieved elsewhere.
Why not use annotations to mark "public" GBean methods/
references/... as
such? (Again, sorry if it's already there, couldn't find it.) Using
the
GBeanFactory doesn't fit into the modern (java5?) approach at all. The
GBeanBuilder is really springing forward like a Java 1.2 artifact.
Recently in trunk Gianny implemented this. I have a couple gbeans I'm
working on (not yet comitted) and it really simplifies things.
I also think we don't have the balance
right yet between "original configuration" and overrides or "tuning
knobs".
Absolutely. The documentation is growing, but still too short for a
big
thing like Geronimo. Take the JFC. A lot of the classes contain as
much
documentation as code. It's just an assumption, but I would hold a
bet that
the Geronimo code is far from that. Not that I'm a Javadoc
fetishist, but I
think it simply needs a lot of what many developers consider as
"bushwah" to
make a project feasible for outsiders. And there could be a lot more
"bushwah" for geronimo.
The masses would probably accomodate better with GBeans if they knew
more
about them, or if the web console (which is supposedly the "first
impression" of Geronimo for 99% of all new Geronimo users) would point
people right at the GBeans concept and make its simplicity so
obvious that
all this unneeded J2EE complexity becomes just a minor matter.
I was so delighted to find the example code for accessing my newly
created
data code on the last page of the wizard. Probably boring for a
Geronimo
developer or an experienced user. For me it was helpful. Why not
take this
brightly shining example of usability a few steps further? When I
create a
data source in J2EE fashion, couldn't there be a box saying: "Aha,
you're
creating a new data source! Good you're working with Geronimo.
Because if
you're used to addressing it like this -{ ugly InitialContext
example }-,
with Geronimo, all you do is [EMAIL PROTECTED] DataSource x}. Read all
about it
[here]."
Cool features are one thing. But they need to be made accessible to be
useful. And by accessible I mean not to the developers, but to the
people
who are supposed to "use" them.
yes..... time is the limiting factor. If you would like to help with
any of this that would be really great!
There is an entry for "modules" in the GUI. If "modules" are really
just the
"shrinkwrap" and GBeans the true essentials in Geronimo, then how
about a
page to browse and view GBeans and their dependencies? Currently, I
have no
idea how many GBeans are running on my box or what they might be
doing, or
how I could reference GBean A to do X, simply because I don't know
that A
exists and offers an X service.
Down near the end of the admin console menu there is a way to browse
all the gbeans and see their attributes etc. I think it might be the
jmx viewer... every gbean is also exposed through jmx. I don't think
its all that easy to tell what services a gbean offers.
From a philosophical point of view, the original attitude was, don't
use jndi at all in gbeans, use gbean references instead
Yes, to get back to this DataSource issue. After spending some more
time
with Google, I found wrapper GBean classes for ActiveMQ connections.
With
these I guess it's possible to wrap a queue as a GBean and then use
gbean-references as you suggested. But are there any similar classes
for
doing the same with regular SQL DB connections/data pools or even XA
connections/data pools or to address the global Transaction Manager?
Or does
Geronimo already instantiate such GBeans by default, but I'm just
not aware
of it?
Yes, every datasource you deploy gets a
ManagedConnectionFactoryWrapper, a ConnectionManager, and a (more or
less useless) connection factory gbean. If you have a j2ca resource
adapter with a ResourceAdapter implementation you also get a
ResourceAdapterWrapper gbean, and every admin object also gets a gbean.
Thanks again
Daniel
--
View this message in context:
http://www.nabble.com/GBean-frustration----please-help-tp17464048s134p17499362.html
Sent from the Apache Geronimo - Users mailing list archive at
Nabble.com.