tuscany-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Simon Nash <n...@apache.org>
Subject Re: Dynamic service references ?
Date Fri, 18 Nov 2011 11:33:21 GMT
Millies, Sebastian wrote:
>> From: Jon Giddy [mailto:jongiddy@gmail.com]
>> Sent: Wednesday, November 16, 2011 5:44 PM
>> On 16/11/11 13:29, Simon Nash wrote:
>>> Millies, Sebastian wrote:
>>>>
>>>> can references in composite files somehow be made dynamic? In
>>>> particular, can I define or override
>>>>
>>>> the endpoints in a web service reference at run time?
> [snip]
>>> It might be possible to use service references for this.  A service
>>> reference can be serialized/deserialized to/from XML.  So you could
>>> use runtime code to create the XML-equivalent form of the service
>>> reference that you need, then deserialize the XML to create the
>>> service reference.
>> We tried something like this, but failed to get it to work fully.
>>
> [snip]
>> We then tried a solution where, as each service starts up, it creates a
>> ServiceReference to itself, marshals that into Base64, and calls an
>> endpoint on the client, passing in its ServiceReference, which is
>> stored
>> in an internal directory (basically a HashMap). The client is then able
>> to retrieve the endpoints from its internal directory and use them.
>>
>> However, a service registering with a client is a little bizarre. We
>> really wanted the service to register its ServiceReference with a
>> directory service, and for the client to retrieve the
>> ServiceReference(s) from the directory service. That is, replace the
>> internal HashMap with an external service. This would be the classic
>> Publish-Find-Bind model of Service Oriented Architecture.
>>
>> However, we couldn't get it to work. The client can get the Base64
>> encoded ServiceReference, and perform the same actions as before, but
>> we
>> get a NullPointerException when attempting to use the reference.
>>
>> It would be great to know if anyone else succeeds at this, as we feel
>> so
>> close to achieving dynamic binding in Tuscany,...and yet so far.
>>
>> Jon.
> 
> My problem is similar but not identical. I would need to manipulate the
> ServiceReference itself according to Simon's suggestion. Now, how would one
> go about serializing and deserializing a ServiceReference to/from XML. I have
> tried two approaches, neither of which will quite work:
> 
> private <T> ServiceReference<T> copy( ServiceReference<T> serviceRef,
String wsUri )
>   throws IOException
> {
> // first approach
>   ByteArrayOutputStream baos = new ByteArrayOutputStream();
>   ObjectOutputStream out = new ObjectOutputStream( baos );
>   out.writeObject( serviceRef );
>   // will not yield XML, but binary data, so is not easily manipulable
>   String xml1 = baos.toString( "UTF-8" ) ;
> 
Agreed.  This isn't what I had in mind.

> // second approach
>   ServiceReferenceImpl<T> sri = (ServiceReferenceImpl<T>) serviceRef;
>   String xml2 = sri.toXMLString();
>   // manipulate xml2 ...
>   ComponentContextHelper cch = ComponentContextHelper.getCurrentComponentContextHelper();
>   Component comp = cch.fromXML( xml2 );
>   List<?> refs = comp.getReferences();
>   // ClassCastException, because we'll get back a RuntimeComponentReferenceImpl
>   ServiceReference<T> sr = (ServiceReference<T>) refs.get( 0 );
> 
>   return sr;
> }
> 
This use of toXML() and fromXML() is the approach that I was suggesting.
I'll look into the ClassCastException to see if I can find a way round it.
I'm busy with another project at the moment, so it's likely to be a few
days before I have any news.

   Simon

> Sebastian
> 
> IDS Scheer Consulting GmbH
> Geschäftsführer/Managing Directors: Kamyar Niroumand, Ivo Totev
> Sitz/Registered office: Altenkesseler Straße 17, 66115 Saarbrücken, Germany - Registergericht/Commercial
register: Saarbrücken HRB 19681
> http://www.softwareag.com
> 


Mime
View raw message