> On 15 Feb 2022, at 13:05, Peter Firmstone <peter.firmst...@zeus.net.au> wrote:
> 
> 
>> How the client knows the code needed to deserialise?
> The service provides this information, typically in a services configuration,
> 
How is this configuration provided to the client and when?
> by default this is a space separated list of URI, similar to a codebase 
> annotation, but it doesn't have to be.  JERI manages the deserialization of 
> code through a default ProxyCodebaseSpi implementation,
> 
How does the default ProxyCodebaseSpi implementation know where to download 
code from if there are no annotations?
> the client applies constraints, to ensure that input validation is used as 
> well as any other constraints, such as principals, or encryption strength.  
> ProxyCodebaseSpi can be customized by the client, so the client may implement 
> ProxyCodebaseSpi if it wants to do something different, eg use OSGi or Maven 
> to manage dependency resolution.
> 
Ok, so the client has to know in advance how to load the service code?
> 
>> Does it require to have it installed in advance? If so - how?
> Only JGDMS platform and JERI.
> 
> 
> 
How are service proxy classes loaded then?

>> How is the following scenario handled:
>> 
>> class JavaSpaceEventPublisher implements RemoteEventListener, Serializable {
>>   private final JavaSpace space;
>> 
>> //… publish event in JavaSpace implementation
>> }
>> 
>> The smart proxy class has dependencies on RemoteEventListener and on 
>> JavaSpace. How do you properly resolve classes in this case?
> Typically the client has the ServiceAPI it needs already installed locally, 
> however this may not always be the case, depending on how you want to resolve 
> the proxy classes and how much you want to share with the client, you can 
> include additional jar files in the annotation, and use preferred.list or you 
> can use Maven or OSGi to resolve dependencies and provision the ClassLoader 
> used for proxy deserialization. 
> 
I am asking about something different - the smart proxy class depends on _two_ 
interfaces:

RemoteEventListener <—— proxy class ——> JavaSpace

RemoteEventListener is its service interface.
But it is not known in advance what interfaces the client already has:

1) Just RemoteEventListener
2) Both RemoteEventListener and JavaSpace
3) None

How is class resolution implemented in JGDMS so that it works properly in _all_ 
of the above cases?
> …[snip]
> 
> If you want to use non final classes for your service method arguments and 
> allow clients to override these classes, then you will need to enable 
> codebase annotations in AtomicILFactory in your configuration.   The caveat 
> is there is no guarantee, the service will be able to resolve these classes 
> at the server endpoint, or that codebase annotation loss won't occur, it will 
> try using existing mechanisms, such as RMIClassLoaderSPI, which is probably 
> fine for seasoned Jini vets, but not so user friendly for the newbie, who now 
> has to debug ClassNotFoundExceptions.
> 
> 


That’s why I got rid of RMIClassLoaderSPI completely - this is simply a wrong 
API and has to be thrown away.


Michal

Reply via email to