「造个轮子」——设计 HTTP 请求全局上下文

 

前言

本次 Cicada 已经更新到了  v1.0.3

主要是解决了两个 issue,#9(Boss线程数好像设置有误 )#8(怎么返回纯字符串内容不要JSON格式?)

所以本次的主要更新为:

  • Cicada 采用合理的线程分配来处理接入请求线程以及 IO 线程。
  • 支持多种响应方式(以前只有 json,现在支持 text)。
  • 为了满足上者引入了 context
  • 优雅停机。

其中我觉得最核心也最有用的就是这个 Context,并为此重构了大部分代码。

多种响应方式

在起初 Cicada 默认只能响应 json,这一点确实不够灵活。加上后续也打算支持模板解析,所以不如直接在 API 中加入可让用户自行选择不同的响应方式。

因此调整后的 API 如下。

想要输出 text/plain 时。

@CicadaAction("textAction") public class TextAction implements WorkAction {     @Override     public void execute(CicadaContext context, Param param) throws Exception {         String url = context.request().getUrl();         String method = context.request().getMethod();         context.text("hello world url=" + url + " method=" + method);     } }

而响应输出 application/json 时只需要把需要响应的对象写入到 json() 方法中.

因此原有的业务 action 中也加入了一个上下文的参数:

/**  * abstract execute method  * @param context current context  * @param param request params  * @throws Exception throw exception  */ void execute(CicadaContext context ,Param param) throws Exception;

下面就来看看这个 Context 是如何完成的。

Cicada Context

先看看有了这个上下文之后可以做什么。

比如有些场景下我们需要拿到本次请求中的头信息,这时就可以通过这个 Context 对象直接获取。

当然不止是头信息:

  • 获取请求头。
  • 设置响应头。
  • 设置 cookie
  • 获取请求 URL
  • 获取请求的 method(get/post)等。

其实通过这些特点可以看出这些信息其实都和一次 请求、响应 密切相关,并且各个请求之间的信息应互不影响。

这样的特性是不是非常熟悉,没错那就是 ThreadLocal,它可以将每个线程的信息存储起来互不影响。

ThreadLocal 的原理本次不做过多分析,只谈它在 Cicada 中的应用。

CicadaContext.class

先来看看 

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信