Intercepts execution segments of an execution, primarily for traceability and recording metrics.
Interceptors present in the base registry will be implicitly applied to all executions.
Execution specific interceptors can be registered via the
ExecStarter#register(Action) method when starting the execution.
The
Execution#addInterceptor(ExecInterceptor,Block) method allows interceptors to be registered during an execution, for the rest of the execution.
import ratpack.exec.ExecInterceptor;public void stop()
long duration = System.currentTimeMillis() - startedAt;
if (blocking)
totalBlocking += duration;
} else
totalCompute += duration;
}
}
public long getBlockingTime()
return totalBlocking;
}
public long getComputeTime()
return totalCompute;
}
}
public static class ProcessingTimingInterceptor implements ExecInterceptor
public void intercept(Execution execution, ExecInterceptor.ExecType type, Block continuation) throws Exception
Timer timer = execution.maybeGet(Timer.class).orElse(null);
if (timer == null) { // this is the first execution segment
timer = new Timer();
execution.add(Timer.class, timer);
}
timer.start(type.equals(ExecInterceptor.ExecType.BLOCKING));
try
continuation.execute();
} finally
timer.stop();
}
}
}
public static void main(String[] args) throws Exception
ExecResult result = ExecHarness.yieldSingle(
r -> r.add(new ProcessingTimingInterceptor()), // add the interceptor to the registry
e ->
Thread.sleep(100);
return Blocking.get(() ->
Thread.sleep(100);
return Execution.current().get(Timer.class);
})
.map(s ->
Thread.sleep(100);
return s;
});
}
);
Timer timer = result.getValue();
assertTrue(timer.getBlockingTime() >= 100);
assertTrue(timer.getComputeTime() >= 200);
}
}
}