Vert.x Web路由配置中能否复用同一BodyHandler实例
结论
完全可以复用同一个BodyHandler实例,不需要为每个路由单独创建。
原因说明
Vert.x Web提供的BodyHandler官方实现采用配置与请求状态分离的设计:
- 你调用
setBodyLimit、setUploadsDirectory这类方法设置的都是实例级的固定配置,实例初始化完成后这些配置不会随请求处理发生变化 - 处理单个请求时产生的所有临时状态(比如已经读取的请求体长度、解析出的表单参数、上传文件临时路径等)全部绑定在当前请求对应的
RoutingContext上下文中,不会存在Handler实例本身的成员变量里,不存在跨请求的状态污染问题,天然线程安全,可以放心在多个路由甚至全局路由上挂载复用。
你之前为每个路由单独创建相同配置BodyHandler的写法属于不必要的对象冗余创建,除了增加微小的内存开销外没有任何实际作用。
优化示例
多路由复用同一实例
如果仅foo、bar、baz三个路由需要该配置的请求体处理,可以按如下方式编写:
// 仅初始化一次,统一配置1MB请求体上限 val commonBodyHandler = BodyHandler.create().setBodyLimit(1024 * 1024) router.route("foo").handler(commonBodyHandler) router.route("bar").handler(commonBodyHandler) router.route("baz").handler(commonBodyHandler)
全局挂载(更简便)
如果你所有路由都需要统一的1MB请求体限制,甚至不需要逐个路由绑定,直接在根路由上挂载一次即可对所有请求生效:
val commonBodyHandler = BodyHandler.create().setBodyLimit(1024 * 1024) // 匹配所有请求,全局生效 router.route().handler(commonBodyHandler)
注意事项
如果部分路由需要差异化的BodyHandler配置(比如文件上传接口需要更大的请求体上限、不需要处理文件上传的接口要关闭上传能力),单独为这部分路由创建对应配置的BodyHandler实例即可,相同配置的路由始终可以共用实例。
内容的提问来源于stack exchange,提问作者odalinho
相关产品推荐
相关产品推荐

