[
https://issues.jboss.org/browse/ISPN-5467?page=com.atlassian.jira.plugin....
]
Dan Berindei edited comment on ISPN-5467 at 8/23/16 4:24 AM:
-------------------------------------------------------------
[~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 {{InvocationStage}} 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.
was (Author: dan.berindei):
[~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)