Class ExecutorSpaceRemotingProxyFactoryBean

java.lang.Object
org.openspaces.remoting.ExecutorSpaceRemotingProxyFactoryBean
All Implemented Interfaces:
org.aopalliance.aop.Advice, org.aopalliance.intercept.Interceptor, org.aopalliance.intercept.MethodInterceptor, RemotingInvoker, org.springframework.beans.factory.Aware, org.springframework.beans.factory.FactoryBean, org.springframework.beans.factory.InitializingBean, org.springframework.context.ApplicationContextAware

public class ExecutorSpaceRemotingProxyFactoryBean extends Object implements org.springframework.beans.factory.FactoryBean, org.springframework.beans.factory.InitializingBean, org.aopalliance.intercept.MethodInterceptor, RemotingInvoker, org.springframework.context.ApplicationContextAware
A space executor remoting proxy that forward the service execution to a remote service with the space as the transport layer. Services are remotely exported in the "server side" using the SpaceRemotingServiceExporter. The actual invocations uses the space executors mechanism to perform the actual method invocation, allowing to perform async invocations (invocations that return Future (which is better than the sync remoting option). In general, the executor based remoting should be used over the sync remoting option.

The proxy requires a setGigaSpace(org.openspaces.core.GigaSpace) interface to be set in order to write execute.

A timeout which controls how long the proxy will wait for the response can be set using setTimeout(long). The timeout value if in milliseconds.

The space remote proxy supports a future based invocation. This means that if, on the client side, one of the service interface methods returns Future, it can be used for async execution. Note, this means that in terms of interfaces there will have to be two different service interfaces (under the same package and with the same name). One for the server side service that returns the actual value, and one on the client side that for the same method simply returns the future. Another option is not having two different interfaces, but having the same interface with async methods (returning Future). The async methods should start with a specified prefix (defaults to async) and should have no implementation on the server side (simply return null).

In case of remote invocation over a partitioned space the default partitioned routing index will be random (the hashCode of the newly created ExecutorRemotingTask class). The proxy allows for a pluggable routing handler implementation by setting setRemoteRoutingHandler(org.openspaces.remoting.RemoteRoutingHandler).

The proxy allows to perform broadcast the remote invocation to all different cluster members (partitions for example) by setting the broadcast flag to true. In such cases, a custom setRemoteResultReducer(org.openspaces.remoting.RemoteResultReducer) can be plugged to reduce the results of all different services into a single response (assuming that the service has a return value).

The actual remote invocation can be replaced with an aspect implementing RemoteInvocationAspect which can be set using setRemoteInvocationAspect(org.openspaces.remoting.RemoteInvocationAspect). It is up the aspect to then call the actual remote invocation.

Note that it is also possible to configure method level broadcasting, RemoteResultReducer, RemoteRoutingHandler, RemoteInvocationAspect and MetaArgumentsHandler using the ExecutorRemotingMethod annotation.

Author:
kimchy
See Also:
  • Field Details

  • Constructor Details

    • ExecutorSpaceRemotingProxyFactoryBean

      public ExecutorSpaceRemotingProxyFactoryBean()
  • Method Details

    • setGigaSpace

      public void setGigaSpace(GigaSpace gigaSpace)
      Sets the GigaSpace interface that will be used to work with the space as the transport layer.
    • setApplicationContext

      public void setApplicationContext(org.springframework.context.ApplicationContext applicationContext) throws org.springframework.beans.BeansException
      Specified by:
      setApplicationContext in interface org.springframework.context.ApplicationContextAware
      Throws:
      org.springframework.beans.BeansException
    • setTimeout

      public void setTimeout(long timeout)
      Sets the timeout that will be used to wait for the remote invocation response. The timeout value is in milliseconds and defaults to 60000 (60 seconds).
    • setRemoteRoutingHandler

      public void setRemoteRoutingHandler(RemoteRoutingHandler remoteRoutingHandler)
      In case of remote invocation over a partitioned space the default partitioned routing index will be random. This RemoteRoutingHandler allows for custom routing computation (for example, based on one of the service method parameters).
    • setBroadcast

      public void setBroadcast(boolean broadcast)
      If set the true (defaults to false) causes the remote invocation to be called on all active (primary) cluster members.
    • setRemoteResultReducer

      public void setRemoteResultReducer(RemoteResultReducer remoteResultReducer)
      When using broadcast set to true, allows to plug a custom reducer that can reduce the array of result objects into another response object.
    • setMetaArgumentsHandler

      public void setMetaArgumentsHandler(MetaArgumentsHandler metaArgumentsHandler)
      Allows to set a meta argument handler that will control SpaceRemotingInvocation.getMetaArguments().
    • setReturnFirstResult

      public void setReturnFirstResult(boolean returnFirstResult)
      When set to true (defaults to true) will return the first result when using broadcast. If set to false, an array of results will be retuned.

      Note, this only applies if no reducer is provided.

    • setRemoteInvocationAspect

      public void setRemoteInvocationAspect(RemoteInvocationAspect remoteInvocationAspect)
      The actual remote invocation can be replaced with an aspect implementing RemoteInvocationAspect which can be set using setRemoteInvocationAspect(org.openspaces.remoting.RemoteInvocationAspect). It is up the aspect to then call the actual remote invocation.
    • afterPropertiesSet

      public void afterPropertiesSet()
      Specified by:
      afterPropertiesSet in interface org.springframework.beans.factory.InitializingBean
    • getObject

      public Object getObject()
      Specified by:
      getObject in interface org.springframework.beans.factory.FactoryBean
    • getObjectType

      public Class<?> getObjectType()
      Specified by:
      getObjectType in interface org.springframework.beans.factory.FactoryBean
    • isSingleton

      public boolean isSingleton()
      Specified by:
      isSingleton in interface org.springframework.beans.factory.FactoryBean
    • invoke

      public Object invoke(org.aopalliance.intercept.MethodInvocation methodInvocation) throws Throwable
      Specified by:
      invoke in interface org.aopalliance.intercept.MethodInterceptor
      Throws:
      Throwable
    • invokeRemote

      public Object invokeRemote(org.aopalliance.intercept.MethodInvocation methodInvocation) throws Throwable
      Description copied from interface: RemotingInvoker
      This invocation will cause the actual remote invocation.
      Specified by:
      invokeRemote in interface RemotingInvoker
      Throws:
      Throwable
    • getServiceInterface

      public Class getServiceInterface()
    • setServiceInterface

      public void setServiceInterface(Class serviceInterface)