package org.infinispan.interceptors;
import org.infinispan.commands.VisitableCommand;
import org.infinispan.commons.util.Experimental;
import org.infinispan.context.InvocationContext;
/**
* Interface for sequential interceptors.
*
* @author Dan Berindei
* @since 9.0
*/
@Experimental
public interface AsyncInterceptor {
/**
* Perform some work for a command invocation.
*
* The interceptor is responsible for invoking the next interceptor in the chain, using
* {@link BaseAsyncInterceptor#invokeNext(InvocationContext, VisitableCommand)} or the other methods in
* {@link BaseAsyncInterceptor}.
*
* @return Either a regular value, or an {@link InvocationStage} created by the {@link BaseAsyncInterceptor} methods.
*/
Object visitCommand(InvocationContext ctx, VisitableCommand command) throws Throwable;
/**
* Sets up the interceptor. Do not call explicitly.
*/
void setNextInterceptor(AsyncInterceptor interceptorStage);
}