| 
      
      On 10/19/2014 11:18 AM, Wim Jongman
        wrote:
 
        I guess I forgot what the question was ;)
 Yes.   A few thoughts/ideas here below.   I wish I could say to
      you that your use case is trivially supported with OSGi Remote
      Services (any implementation...or specifically ECF's), but in
      truth I think that at the root is a slight mismatch between the
      'remote procedure call' (RPC) model underneath OSGi Remote
      Services and what you are looking to do.
 
 First, with ECF's support for CompletableFuture, it is possible to
      easy to define an asynchronous/non-blocking remote method
      invocation, e.g. see [1].  But this isn't exactly what you are
      looking for, at least partially because it only completes *once*. 
      But it does provide what I think of as a very nice way to express
      asynchronous/non-blocking remote services.
 
 Let's say we have declared a service API that looks like this:
 
 void myMethodCall(String s, SomeCallback callback)
 
 with the behavior being that 'callback can/is'  called potentially
      many times.  An example is all the Eclipse methods that have
      IProgressMonitor as the final argument in the method call.
 
 The question is:  How to implement this remotely/in a distributed
      app?   As you know, it's possible to pass method arguments and
      return values either by reference or by value.   For most remote
      method calls passing by value is the norm (e.g. 's' argument in
      the above), but it is possible to implement remote references,
      allowing 'callback' instances/object references to be referred
      to/called from out of process (e.g. a remote service host).
 
 For example, Java's RMI is an implementation that has call by
      reference.   And it would be possible using RMI and/or other
      call-by-reference distribution to implement a provider that
      supports the above callback structure.  For example, an RMI-based
      provider could (pretty) easily be created for OSGi remote
      services.
 
 But call-by-reference can/does end up being very complex in the
      real (distributed) world...for a number of reasons.  One reason is
      that unlike local/memory object references, remote references
      frequently fail and when they do it's often unclear what should
      happen.   Another reason is that remote references make garbage
      collection particularly complex (since not all object references
      are in local memory).   A third reason is that the network can
      introduce blocking that is problematic (for example, with Eclipse
      EFS if a remote file system is used the calls to the
      IProgressMonitor can block/be very slow...meaning that Eclipse
      can/does just 'freeze up' for long periods).   So in any event,
      the distributed systems world has kind of moved away from fully
      pass-by-reference for RPC systems,  because of these and other
      complexities.
 
 Another common way to implement this sort of desired behavior is
      with event-driven approaches/asynchronous messaging.   One example
      is the ECF filetransfer API...another is the ECF datashare and
      shared object APIs, as well as JMS, vert.x, akka, zeromq, mqtt,
      javagroups, etc...all of the asynchronous/messaging-based
      middleware.
 
 More than an implementation difference, I think what you are
      asking for implies a different sort of API than the 'normal' RPC,
      which I summarize as:    A thread calls a method synchronously and
      method returns a single value to same thread.   What I think you
      are really asking for is a simple way to express a behavior that
      isn't clearly expressed with a single method call (RPC), e.g. send
      a message and some data, return from this
      immediately/non-blocking, and receive one or more (remote)
      callbacks (with arbitrary data).    IMHO this is awkward for the
      remote procedure call/OSGi remote service model in general, and it
      gets really complicated when you factor in the distributed systems
      issues of (e.g.) partial failure (what should happen if one of n
      callbacks fails?).  And then things get *really* complex when we
      are talking about > 2 group members.
 
 There are of course other ways to deal with this sort of behavior
      e.g. callbacks can be 'client-exported' remote services., the
      'remote whiteboard pattern' like the chat example that you and
      Markus created, etc.   IMHO these approaches have their own
      complexities (e.g. how to dynamically associate the callback
      remote service instance with the service interface, how to do
      reliable discovery of the 'whole/associated thing', what happens
      when things fail because of network unreliability, etc.).  But
      even so, there could probably be more/better standardized API
      and/or meta-data specifically for doing the 'remote whiteboard
      pattern'.
 
 It's my hope that we and others can/could eventually create
      standardized API (e.g. MultiCompletableFuture?, remote streams,
      standardized event/messaging models, replicated data structures,
      or collectors, etc  :) that would help deal with this and similar
      use cases.  ECF has much of the underlying support for different
      approaches (e.g. asynchronous messaging, replicated data models,
      etc), meaning that we can easily try out/implement a variety of
      approaches.
 
 My $0.03.
 
 Scott
 
 
 
 
 
 _______________________________________________
ecf-dev mailing list
ecf-dev@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/ecf-dev 
 |