Yes that's the beauty of Services, they provide opportunity for
pluggable replacement implementations. That's the "Service
Pattern" As
we have seen it is possible to use the Service Pattern to solve
a number
of different problems. Eg Netbean Plugins, SPI, OSGi, Jini.
I'm looking at OSGi to wire up services inside the JVM as you
say. When
I say package, I mean a java package residing in the local JVM
it may or
may not be part of a Jini service, it may be a purely local JVM
package,
eg a library dependency or local domain package. For example, I
have
package X, version 1 loaded in my local JVM, I need to have
package X
version 2 loaded as version 1 isn't compatible with the new
Objects
(domain data) I'm recieving in serialized form. I need to share
this
information locally with Package Y that currently has references
to
objects in Package X version 1. The Objects in Package X
version 1 that
Package Y references need to have their class files upgraded.
Without
OSGi I can do this by persisting state, stopping the JVM,
restarting and
loading package X version 2.
I'm not looking at distributed OSGi, but I can see a use case for
utilising a Jini Service, when a local OSGi bundle that performs
some
task that could be done optimally if the processing can be moved
to
where the data resides, this is just an example there are
probably 10
other ways of doing this:
A local application bundle that provides an OSGi service locally
queries
a remote database using JDBC and performs a considerable amount of
manipulation to that data prior to returning a subset. The
query and
its result are sent over the network using a database JDBC
connection.
The processing for that data, if shifted to the machine that has
the
database data, would consume significantly less network
resources. EG
the data transferred over the network is reduced by a factor of
100 by
processing the data on the database machine after querying. A
bundle
that provides a "local JVM application" an "OSGi service" could
utilise
a "Jini Service" to request the data be processed at the Database
machine in a particular manner before receiving the result. This
function could be locally available as an OSGi service to some
other
local application, that application doesn't need to know about
Jini, it
is an implementation detail that is abstracted.
My objectives are all based around codebase services (objects
aren't
locked to their http codebase origin), in combination with OSGi or
something like it, to ensure compatible classes and packages are
loaded
among separate JVM instances. Yes Newton does something similar,
however it is AGPLv3 licensed.
I envision a distributed environment where nodes can have the
majority
of their packages downloaded and upgraded via codebase servcies.
Providing an evolving cluster, that upgrades it's bundles
incrementally,
while maintaining the maximum level of class and package
compatibility.
Think Agile Cluster Running System component upgrades.
People, who are jumping in now because I've mentioned OSGi, are
making
assumptions and haven't been following the discussions I've posted
previously about Versioned Classes, Classloader trees, Static
Analysis
and Codebase Services, this is frustrating as I was hoping for
some
participation. It seems I can only get attention when I mention a
controversial subject. What I want is attention to solving the
problems
that will make River better.
In my note below when I'm referring to the "Service Pattern", I
mean the
service pattern that OSGi implements, enables bundles to be
upgraded by
loading the replacement bundle in a new classloader, The
service is a
common interface, the new upgraded service is discovered after
it is
started. The alternative is to use delegates to update references
between objects when the Classloader changes as per some of the
other
patches I've uploaded.
Jini also utilises a "Service Pattern", but to solve a different
problem.
I knew this was going to be a difficult topic to present.
What we need are separate lists, where people who want to
participate in
constructive development to solve problems can do so and another
list
where people can pontificate about software ideals and have
disrespectful arguments with each other without holding up
development.
While we're developing we can keep an eye on the argument list
without
getting embroiled.
Anyway I've said enough, I'm going back to doing the things I
need to
do, if someone who has been following my posts to date has
implementation ideas, but are afraid to mention it, please feel
free to
contact me directly to discuss, I do need some input to gain
confidence
that I'm approaching these problems in the right manner.
Peter.
Dennis Reedy wrote:
On Nov 8, 2009, at 1251AM, Peter Firmstone wrote:
I had avoided OSGi purely due to the controversy it generates
on this
list, however without the Service Pattern one cannot upgrade a
package
without first persisting everything and shutting down the
entire JVM,
then restarting. At least OSGi allows you to stop a bundle
and any
dependents, persist what you need to then start with a later
bundle
version if desired, without having to persist or shut down the
entire
JVM.
If thats all you want you dont need OSGi. Service lifecycles are
supported with a variety of container approaches, from JEE,
Spring to
Rio. You also do not need to shutdown the JVM to load new service
classes.
Adopting OSGi as a micro-kernel architecture for wiring up
services
inside the JVM is a different thing. Looking at distributed
OSGi is a
totally different thing on top of that. IMO, if you want to
consider
OSGi for River, you focus on the former, not the latter.