> we can delegate interceptors as a chain

Thanks Nikita, this was my thinking too.

On Wed, Jun 29, 2022 at 1:55 PM Nikita Amelchev <namelc...@apache.org>
wrote:

> Hello,
>
> The single method proposal looks good to me.
>
> > But with this approach, a service can only have one interceptor, right?
>
> Pavel, I think we can delegate interceptors as a chain. The last
> delegate calls the service method.  In this way, multiple ordered
> interceptors can be configured.
>
> ср, 29 июн. 2022 г. в 12:13, Pavel Pereslegin <xxt...@gmail.com>:
> >
> > Hello Pavel,
> >
> > I think your suggestion is better because it seems more flexible to me
> > and only one method needs to be implemented by the user. So we don't
> > need a default (no-op) implementation.
> > But with this approach, a service can only have one interceptor, right?
> > It also seems to be more error prone from the user side. The user may
> > return a result of the wrong type for example. But I think this is ok,
> > so if there is no objection, I will update the IEP and prepare a patch
> > using the suggested approach.
> >
> > вт, 28 июн. 2022 г. в 19:30, Pavel Tupitsyn <ptupit...@apache.org>:
> > >
> > > Hello Pavel,
> > >
> > > The IEP looks good to me in general. It is a good addition to the
> service
> > > API.
> > >
> > > One suggestion is to improve control over service method execution
> within
> > > the interceptor:
> > > 1. Bypass service call without throwing an exception.
> > > 2. Convert service call result in some way
> > >
> > > This can be achieved by a different interface, with a single method:
> > >
> > > public interface ServiceCallInterceptor extends Serializable {
> > >     public default Object onInvoke(Supplier delegate, String mtd,
> Object[]
> > > args, ServiceContext ctx) throws ServiceInterceptException {
> > >         return delegate.get();
> > >     }
> > > }
> > >
> > > which can be implemented like this:
> > >
> > > public class MyInterceptor implements ServiceCallInterceptor {
> > >     @Override
> > >     public Object onInvoke(Supplier delegate, String mtd, Object[]
> args,
> > > ServiceContext ctx) throws Exception {
> > >         AuditProvider.get().recordStartEvent(mtd,
> > > ctx.currentCallContext().attribute("sessionId"));
> > >         try {
> > >             if (!checkAuthorization(ctx))
> > >                 return notAuthorizedResult();
> > >
> > >             Object value = delegate.get();
> > >
> > >             return convert(value);
> > >         }
> > >         catch (Exception e) {
> > >             // Log error
> > >             return errorResult(...);
> > >         }
> > >         finally {
> > >             AuditProvider.get().recordEndEvent(mtd,
> > > ctx.currentCallContext().attribute("sessionId"));
> > >         }
> > >     }
> > > }
> > >
> > >
> > > As you can see, this way the user has full control over all aspects of
> the
> > > service call.
> > >
> > > Thoughts?
> > >
> > > On Tue, Jun 28, 2022 at 6:33 PM Pavel Pereslegin <xxt...@gmail.com>
> wrote:
> > >
> > > > Hello Igniters!
> > > >
> > > > I want to continue discussing a feature that allows users to create
> > > > their own middleware for Ignite services [1].
> > > > Earlier was added the ability to implicitly pass a set of user
> > > > parameters (ServiceCallContext) to the service [2].
> > > > This feature allows users to track the origin of a service call.
> > > > Now I'd like to add a service call interceptor to allow the user to
> > > > separate the "middleware" logic from the business code and reduce
> > > > boilerplate code [3].
> > > >
> > > > I've prepared an IEP for this feature, please take a look [4].
> > > > I will prepare patches for Java and .NET for this feature soon.
> > > >
> > > > [1] https://lists.apache.org/thread/wqlvskxr0fvdo6rbo64bnct4zz53kpr0
> > > > [2] https://issues.apache.org/jira/browse/IGNITE-15572
> > > > [3] https://issues.apache.org/jira/browse/IGNITE-17022
> > > > [4]
> > > >
> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=191334119
> > > >
>
>
>
> --
> Best wishes,
> Amelchev Nikita
>

Reply via email to