...
ServiceCallContext - immutable map of custom parameters to be implicitly passed to the service
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
public interface ServiceCallContext { public String attribute(String name); public byte[] binaryAttribute(String name); } |
ServiceCallInterceptor - intercepts service method calls.
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
public interface ServiceCallInterceptor extends Serializable { public default void onInvoke(ServiceInterceptorContext ctx) throws ServiceInterceptException { // No-op. } public default void onComplete(@Nullable Object res, ServiceInterceptorContext ctx) throws ServiceInterceptException { // No-op. } public default void onError(Throwable err, ServiceInterceptorContext ctx) { // No-op. } } |
ServiceInterceptorContext - extended mutable version of caller context (interceptor obtains method call parameters from it and can use it to update the caller context).
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
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); } |
...
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
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(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); |
Interceptor only applies to user-defined business methods and does not apply to service lifecycle methods - init, execute andcancel,
Interceptor can modify ServiceCallContext, but Service methods can only read it.
...
Interceptor is located and executed where the service is implemented (for Java service - on Java side, for .NET-service on .NET side without any ). Its execution should not cause additional serialization).
To add/remove interceptor - service should be redeployed.
...
Interceptor must support ignite instance resource injection.
Interceptor should be support LifeCycleAware
// todo ServiceInterceptException
Interceptor can only throw unchecked exceptions.
Any runtime exception thrown by the onInvoke/onComplete methods will be wrapped in a ServiceInterceptException. This exception will be passed to the initiator (user) and to onError method of the interceptor.
The exception thrown by the onError method will be added to the main exception as suppressed.
If onInvoke If an interceptor throws an exception, then processing is aborted, but the exception is passed to all listed interceptors (onError)the service method will not be executed.
...