Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. Ability to pass custom context from caller to service (similar to HTTP request headers).
  2. Ability to define custom interceptors for service calls.

Suggested design

...

New public API entities

  • ServiceCallContext -  immutable map of custom parameters to be implicitly passed to the service.
  • ServiceCallInterceptor  - intercepts service method calls.
  • ServiceInterceptorContext -  extended mutable version of caller context (interceptor obtains method call parameters from it and can use it to update the caller context).
  • ServiceInterceptException - unchecked exception that is used to highlight the exception that occurred during method interception (not execution).

...

Code Block
languagejava
themeConfluence
titleServiceInterceptorContext
linenumberstrue
public interface ServiceInterceptorContext extends ServiceCallContext {
    public String method();

    public @Nullable Object[] arguments();

    public void attribute(String name, String val);

    public void binaryAttribute(String name, byte[] val);
}

...

Requirements/limitations

  • The service interceptor binds to the service itself. It is executed where the service is implemented (for Java service - on Java side, for .NET-service on .NET side without any additional serialization).
  • Any interceptor can change the ServiceCallContext.
  • If an interceptor has been specified, but the user has not passed the caller context through the proxy, it will be created dynamically.
  • ServiceCallContext must be accessible inside the service.
  • Interceptor must support ignite instance resource injection.
  • (question)Interceptor should be LifeCycleAware?
  • (question) If an interceptor throws an exception, then processing is aborted, but the exception is passed to all listed interceptors (onError)?

Example of usage (diagram)

draw.io Diagram
bordertrue
diagramNamemiddleware
simpleViewerfalse
width
linksauto
tbstyletop
lboxtrue
diagramWidth1001
revision13

Example of usage (code)

Code Block
languagejava
themeConfluence
linenumberstrue
        ServiceCallInterceptor security = new ServiceCallInterceptor() {
            @Override public void onInvoke(ServiceInterceptorContext ctx) throws ServiceInterceptException {
                // Check permission before execution of the method.
                if (!CustomSecurityProvider.get().access(ctx.method(), ctx.attribute("sessionId")))
                    throw new SecurityException("Method invocation is not permitted");
            }
        }

        ServiceCallInterceptor audit = new ServiceCallInterceptor() {
            @Override public void onInvoke(ServiceInterceptorContext ctx) {
                // Record an event before execution of the method.
                AuditProvider.get().recordStartEvent(ctx.method(), ctx.attribute("sessionId"));
            }

            @Override public void onComplete(@Nullable Object res, ServiceInterceptorContext ctx) {
                AuditProvider.get().recordFinishEvent(ctx.method(), ctx.attribute("sessionId"));
            }

            @Override public void onError(Throwable err, ServiceInterceptorContext ctx) {
                AuditProvider.get().recordError(ctx.method(), ctx.attribute("sessionId"), err.getMessage());
            }
        }

        // Set context parameters for service proxy.
        ServiceCallContext ctx = ServiceCallContext.builder().put("sessionId", sessionId).build();

        ServiceConfiguration svcCfg = new ServiceConfiguration()
            .setName("service")
            .setService(new MyServiceImpl())
            .setMaxPerNodeCount(1)
            .setInterceptors(Arrays.asList(security, audit));

        // Deploy service.
        ignite.services().deploy(svcCfg);

        MyService proxy = ignite.services().serviceProxy("service", MyService.class, false, ctx, 0);

        // A business method call to be intercepted.
        proxy.placeOrder(order1);
        proxy.placeOrder(order2);  


Risks and Assumptions

// Describe project risks, such as API or binary compatibility issues, major protocol changes, etc.


Discussion Links

https://lists.apache.org/thread.html/r4236c1f23e524dc969bc55057467a2bbe7f9a59a6db7c7fcdc1b7d37%40%3Cdev.ignite.apache.org%3E

Reference Links

...


Tickets

Jira
serverASF JIRA
columnIdsissuekey,summary,issuetype,created,updated,duedate,assignee,reporter,priority,status,resolution
columnskey,summary,type,created,updated,due,assignee,reporter,priority,status,resolution
maximumIssues20
jqlQuerylabels = IEP-79 order by fixVersion
serverId5aa69414-a9e9-3523-82ec-879b028fb15b