事先说明:为了满足这个需求,尝试很多种方法,暂定的方法仍然有缺陷,希望有更好的办法评论能告诉我,甚至研究了几天vertx的源码。
首先先大致说下vertx web server的运行流程:
1.配置route,将route模块加载到vertx中,vertx通过调用listen方法绑定监听
2.请求到来之后,调用 listenContext.runOnContext将请求交给route模块处理
3.模块handler会创建VertxThread,并开启一个由vertx管理的线程进行处理
4.route间handler的执行切换,通过调用next方法实现,如果没有下一个handler,会自动调用下一个routeimpl中第一个handler(通过router.route.handler来创建的routeimple)
之后说明一下我现在使用的方法:
先实现一个自己的抽象类,来动态代理生成自己的RoutingContext ,已便能在调用next方法时拦截到来记录日志
/**
* 自定义handler
* @author lw
*/
@Slf4j
public abstract class BaseHandler implements Handler<RoutingContext> {
/**
* 动态代理生成自定义的RoutingContext
* 便于记录执行耗时
* @param routingContext
*/
@Override
public void handle(RoutingContext routingContext) {
//TODO 是否需要更换为cglib来实现动态代理
ProxyUtil proxyUtil=new ProxyUtil(routingContext,getHandlerName());
routingContext= (RoutingContext) Proxy.newProxyInstance(RoutingContext.class.getClassL