[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| Re: [ecf-dev] Remote service question | 
Hi Halvard,
On 10/20/2014 12:41 AM, Hallvard Trætteberg wrote:
Hi,
A comment on async remote calls: There are two sides to this, the 
caller side and callee side. The caller side is nicely handled with 
the CompletableFuture, since it allows you to register a one-time 
callback. But what if the callee side also needs to be async?
In my case, the service is implemented on a server side Eclipse, and 
its task is to update one or more Eclipse resources and return the 
problem markers that appear after the build. The method is something 
like the following:
Collection<Problems> updateResources(Collection<ResourceUpdates)).
The service implementation needs to update the resources and then wait 
for a listener to be notified about the changes to the problem markers 
attached to the same resources. Hence, the service implementation is 
also async, since it needs to wait for a value that will later be made 
available from a different thread. I can use wait and notify to handle 
this, but would rather use a CompletableFuture. I.e. the service 
method would be changed to CompletableFuture<Collection<Problems>> 
updateResources(Collection<ResourceUpdates)) and then the service 
implementation could immediately return a CompletableFuture and later 
call complete. My question is, can the callee end of a remote service 
handle this, i.e. receive a CompletableFuture from a service 
implementation method and wait for the value to appear?
On the callee side (aka remote service host), typically what happens 
(i.e. for most remote service distribution providers) is that a new 
thread is created to synchronously call the remote service method. So, 
for example
(again on the callee/RS host side)
RS consumer/client/caller
|
| (network)
V
Remote Call arguments are unmarshalled
A thread is created
New thread calls the remote service method...e.g:
Collection<Problems> updateResources(Collection<ResourceUpdates))
The return value is marshalled
|
|  (network)
V
RS consumer/client/caller
The use of a new thread (or rather a thread pool in most cases)to 
implement the actual service method call means that call may block for 
as long as desired to produce a Collection<Problems> for delivery back 
to the RS consumer, without affecting/blocking other calls or anything 
else that the host process is doing.
Unless I'm misunderstanding you, the implementation of the service 
method can/could create a CompletableFuture, wait for any asynchronous 
operations to complete, create the associated Collection<Problems> and 
then simply return the Collection<Problems> to the distribution system 
for marshalling and delivery back to the caller.  Since the distribution 
system creates a thread to execute the callee service method, this is 
already asynchronous.   Would this give you want you want?
It's also possible with ECF's implementation to create a new 
distribution provider (or just customize an existing one) such that the 
*distribution system* uses CompletableFuture as you describe to do 
things asynchronously on the RS host/callee, rather than create a new 
thread as the existing providers do/described above.   That's perhaps a 
little more work though, so before we talk about that I should make sure 
that I'm interpreting correctly what you are wanting to do.
Thanks,
Scott