On 8/22/07, Nodet Guillaume <[EMAIL PROTECTED]> wrote:
> As I explained in the other thread, I've been working on a new API
> for ServiceMix 4.0.
> Hopefully this will serve as an input for JBI 2.0.
> This API is available at  https://svn.apache.org/repos/asf/incubator/
> servicemix/branches/servicemix-4.0/api
>
> So here a few key changes:
>    * clean integration with OSGi
>    * the NormalizedMessage can contain not only XML

Nice!

>    * no more components
>    * no more JBI packaging (just use OSGi bundles)
>    * move the Channel to the Endpoint
>    * use push delivery instead of pulling exchanges

This is an interesting change for sure.

>    * introduce a single interface for identifying the Target of an
> Exchange

How will this work? Can you explain this one a bit more?

> As we remove components, everything goes down to the endpoint which
> become a key feature.
>
> The endpoint must implement the Endpoint interface.  In OSGi, the NMR
> would listen to endpoints
> registered in the OSGi registry and call the registry to register /
> unregister the endpoints.
> As part of the endpoint registration, the NMR would inject a Channel
> into them, thus actually activating the
> endpoint.  I guess I could write a sequence diagram for that (anybody
> knows a good tool for uml ?).

I've been trying to find some good UML software for a while -
something that doesn't cost an arm and a leg, that generates sequence
diagrams (IMO, these are invaluable!) from code and that runs on MacOS
X. Anyone know of something that meets this criteria?

> In a non OSGI environment, the Endpoint will be registered in the
> Registry by calling the register method
> somehow.

Is there any interoperability between the OSGi registry and a UDDI registry?

> The Endpoint receives Exchange to be processed on the process method.
> I think we should keep the JBI 1.0 semantics and the endpoint use the
> same process as for JBI 1.0, which is
> send the exchange back using the Channel (with the response / fault /
> error / done).  This will put the threading,
> transactions and security burden on the container itself.  Which
> means it is easier to write JBI apps :-)

This is exactly the architecture we need - a much cleaner separation.

> Exchanges can be created using the Channel#createExchange method.
> The only change I'd like to
> integrate in the messaging API is to allow for non xml payloads and
> maybe untyped attachments.  The body
> could be converted automatically to a given type if supported (I
> think Camel does it nicely, so I'm thinking of
> shamelessly copying the converter layer).  I have added a few helper
> methods on the exchanges and
> messages (copy, copyFrom, ensureReReadable, display) to ease message
> management.

Very nice, sounds similar to Spring convenience classes.

> For the deployment part, there is no packaging anymore.  One would
> deploy an OSGi bundle that would
> register the needed endpoints in the OSGi registry.  For certain
> types of endpoints, we may need an external
> activation process (such as creating a server socket for listening to
> HTTP requests) that may need to be shared
> across endpoints of a given type.  In such a case, you would deploy a
> "component" that listens to new
> endpoints implementing HttpEndpoint for example.  When a new endpoint
> is registered, the listener would
> activate a server socket that could be shared across all http
> endpoints.   In a different way, if we have  a BPEL
> engine, the bpel "component"  would listen for new bundles and look
> for a specific file containing deployment
> information. The component would register new endpoints in the OSGi
> registry as needed (we could do that
> for jaxws pojos using cxf for example).
> So I said there is no more components, because this feature is not in
> the api anymore, but we will certainly need
> these components for some use cases.   For simple endpoints, you
> would not need any component at all.
> Another benefit is that you can easily deploy a whole application
> inside a single OSGi bundle.  Using spring-osgi,
> the bundle would just consist in a spring configuration file
> containing the endpoints declaration and expose them
> as OSGi services.

I'm not sure I understand this completely. Is this a type of
interceptor or am I misunderstanding you?

> Of course, we need to write a JBI 1.0 compatibility layer, and we
> could have an intermediate layer where SAs and
> JBI components could be OSGi bundles directly, thus leveraging the
> OSGi classloading mechanism.

Yep.

> The thing I'm not completely sure about if the Target interface which
> aims to identify the target of an exchange.
> I'm thinking that some metadata are associated with endpoints (like
> service name, interface name, wsdl
> location, etc..).   These metadatas could be used to retrieve targets
> using the Registry.  We could plug in different
> mechanisms to query the metadata (simple lookup per id, policy based,
> etc...).  And the result itself could be
> not only a single Endpoint, but could include some policies like:
> load balance between all the endpoint implementing
> the given interface, etc....  Also, I think Target should be injected
> on Endpoints using spring, so you would look up a
> targe using a spring bean factory (or multiple ones):
>     <smx:endpoint-target id="my-endoint-id" />
> or
>     <smx:interface-target name="my:qname" />
> The API is quite open right now, so any ideas welcome.

Very nice!

> I think i covered the main areas of the API.  The main goal is OSGi
> and leveraging it as much as possible.  There are
> still some gray areas: what about the start/stop/shutdown lifecycle
> which may be needed in some cases as I
> discovered recently (when you want to gracefully shutdown a jms
> consumer without loosing the ongoing messages
> for example).  I also want to give due credits to James, which has
> been working with me on that.
> Remember that nothing can't be changed and that' s why I'm asking for
> feedback at this early stage, where there are
> only ideas ;-)

Yes, the lifecycle is a must so that messages are not dropped. I know
that OSGi provides a lifecycle for bundles, how does this affect what
you mention above?

Bruce
-- 
perl -e 'print unpack("u30","D0G)[EMAIL 
PROTECTED]&5R\"F)R=6-E+G-N>61E<D\!G;6%I;\"YC;VT*"
);'

Apache ActiveMQ - http://activemq.org/
Apache ServiceMix - http://servicemix.org/
Apache Geronimo - http://geronimo.apache.org/
Castor - http://castor.org/

Reply via email to