[infinispan-issues] [JBoss JIRA] (ISPN-5467) Design new interceptor interfaces for sequential invocation

Dan Berindei (JIRA) issues at jboss.org
Thu Aug 18 10:37:00 EDT 2016


    [ https://issues.jboss.org/browse/ISPN-5467?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13280911#comment-13280911 ] 

Dan Berindei commented on ISPN-5467:
------------------------------------

[~belaban] it's probably worth a wiki page, but I'm going to add a brief description here :)

I've just issued a new [PR|https://github.com/infinispan/infinispan/pull/4520], so that's what I'm going to describe.

* Interceptors extending {{CommandInterceptor}} still work, and can use only {{invokeNext(ctx, command)}} to invoke the next interceptor synchronously.
* The new base class is {{BaseAsyncInterceptor}}, which defines a single {{visitCommand(InvocationContext, VisitableCommand)}} entry point. 
* {{DDAsyncInterceptor}} extends {{BaseAsyncInterceptor}} to add the familiar {{visitXCommand(\[Tx\]InvocationContext, XCommand)}} entry points.
* The return type of the {{visitXCommand}} methods is {{BasicInvocationStage}}, only allow you to extract a value or convert to a {{CompletableFuture}}.
* {{BaseAsyncInterceptor}} defines some methods that return a {{BasicInvocationStage}}, or a more feature-full {{InterceptorStage}} instance: 
** {{invokeNext(ctx, command)}} works just like {{CommandInterceptor.invokeNext}}, except the invocation may be asynchronous.
** {{returnWith(value)}} returns a value, because we can't just return a value directly.
** {{goAsync(CompletableFuture<BasicInvocationStage>}} continues the invocation asynchronously.
** {{invokeNextAsync(ctx, command, future)}} is a shortcut for {{goAsync(f.thenApply(o -> invokeNext(ctx, command)))}.
** {{returnWithAsync(value)}} is a shortcut for {{goAsync(f.thenApply(o -> returnWith(ctx, command)))}.
* {{InvocationStage}} extends {{BasicInvocationStage}} with a few more {{CompletionStage}}-like features. The main differences from {{CompletionStage}} are:
** All callbacks receive two extra parameters: the context and the command. In many interceptors, this allows us to store the callback in a field instead of creating a new instance on each invocation.
** Callbacks can throw {{Throwable}}, and received exceptions are not wrapped in `CompletionException`. I'm on the edge about this, but I'm sure a switch to `CompletionException` wrapping should be have a separate issue anyway.
** Not all {{CompletionStage}} methods are implemented, e.g. we don't support combining two invocation stages with {{thenCombine}}.
** We also have one extra method, {{compose((BasicInvocationStage, InvocationStage, VisitableCommand, Object, Throwable) -> BasicInvocationStage. It works like {{CompletionStage.thenCompose}}, but the callback gets called even if the invocation stage failed.


> Design new interceptor interfaces for sequential invocation
> -----------------------------------------------------------
>
>                 Key: ISPN-5467
>                 URL: https://issues.jboss.org/browse/ISPN-5467
>             Project: Infinispan
>          Issue Type: Task
>          Components: Core
>    Affects Versions: 7.2.1.Final
>            Reporter: Dan Berindei
>            Assignee: Dan Berindei
>             Fix For: 9.0.0.Beta1, 9.0.0.Final
>
>
> We need the interceptors to execute in sequence instead of using a stack in order to allow interrupting the execution of a command on one thread and continuing the execution on another thread.



--
This message was sent by Atlassian JIRA
(v6.4.11#64026)


More information about the infinispan-issues mailing list