CicadaRequest cicadaRequest = CicadaHttpRequest.init(defaultHttpRequest) ;
首先是将 request 初始化:
CicadaHttpRequest
自然是实现了 CicadaRequest
接口:
这里只保存了请求的 URL、method 等信息,后续要加的请求头也存放在此处即可。
Response
也是同理的。
这两个具体的实现类都私有化了构造函数,防止外部破坏了整体性。
接着将当前请求的上下文保存到了 CicadaContext
中。
CicadaContext.setContext(new CicadaContext(cicadaRequest,cicadaResponse));
而这个函数本质使用的则是 ThreadLocal
来存放 CicadaContext
。
public static void setContext(CicadaContext context){ ThreadLocalHolder.setCicadaContext(context) ; } private static final ThreadLocal<CicadaContext> CICADA_CONTEXT= new ThreadLocal() ; /** * set cicada context * @param context current context */ public static void setCicadaContext(CicadaContext context){ CICADA_CONTEXT.set(context) ; }
处理业务及响应
接着就是处理业务,调用不同的 API 做不同响应。
拿 context.text()
来说:
其实就是设置了对应的响应方式、以及把响应内容写入了 CicadaResponse
的 httpContent
中。
业务处理完后调用 responseContent()
进行响应:
responseContent(ctx,CicadaContext.getResponse().getHttpContent());
其实就是在上下文中拿到的响应方式及响应内容返回给客户端。
卸载上下文
最后有点非常重要,那就是 卸载上下文。
如果这里不做处理,之后随着请求的增多,ThreadLocal
里存放的数据也越来越多,最终肯定会导致内存溢出。
所以 CicadaContext.removeContext()
就是为了及时删除当前上下文。
优雅停机
最后还新增了一个停机的方法。
其实也就是利用 Hook
函数实现的。
由于目前 Cicada
开的线程,占用的资源都不是特别多,所以只是关闭了 Netty 所使用的线程。
如果后续新增了自身的线程等资源,那也可以全部放到这里来进行释放。