Kafka封装之方法参数解析器,用起来真香!
大家好,我是Jensen。一个想和大家一起打怪升级的程序员朋友。
咱们在写Kafka消费者的时候,有没有发现一个很麻烦的事:每次都要手动解析Kafka消息,转换成自己想要的类型,再进行业务操作,比如:/** * 订单支付成功通知 * @Author 公众号:架构师修行录 */ @KafkaListener(topics = "oms.orderPaySuccess", groupId = "fms") public void orderPaySuccess(ConsumerRecord consumerRecord) { // 解析Kafka消息 OrderPaySuccessEvent event = JSON.parseObject(consumerRecord.value(), OrderPaySuccessEvent.class); // TODO 完成解析成功后的业务操作 }
对代码有洁癖的同志就比较难受了,每次解析的操作都差不多,但这又不是业务代码……于是你就想:有没有一个办法让系统能够自动解析成自己想要的参数对象呢?
其实是有的,早在一年前,我写过一个组件,对kafka消费做了一层浅封装,也一直在工程中沿用到现在:Kafka消费者这样写,一年节省10,000行代码
不过也发现了一些难以解决的问题,比如:共用了一个groupId,使用Java线程池来管理,这样工程会存在性能瓶颈。
专业的事还是交给专业的"人"来做吧,用Kafka组件本身来管理不同分组消费会更靠谱。
Spring官方也发现这个问题,并且对此提出了解决方案——spring-messaging包下的HandlerMethodArgumentResolver接口。
Spring官方说明
我们从官方文档中看到,Spring-kafka在2.4.2版本支持了对kafka消息进行方法参数级别转换。
其实,spring-web包下也有这个同名接口,用于自动解析Controller方法上的参数,这块网上资料比较多我就不详细展开了,而spring-messaging包下面这个接口的非官方资料比较少,我这里给大家总结一下用法。
HandlerMethodArgumentResolver方法参数处理器接口很简单,只有两个方法:public interface HandlerMethodArgumentResolver { boolean supportsParameter(MethodParameter var1); @Nullable Object resolveArgument(MethodParameter var1, Message<?> var2) throws Exception; }
supportsParameter方法返回是否支持参数自动解析,resolveArgument方法就是具体的解析逻辑,把MQ传递参数转换为具体类型参数。
我们来看一下实际案例。
首先实现HandlerMethodArgumentResolver接口,定义为一个Spring的Component:@Component public class KafkaListenerMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(@NonNull MethodParameter parameter) { // 默认以com.xxx开头的类,这样可以不用在在参数前加@Payload注解 return parameter.getParameterType().getName().startsWith("com.xxx") || parameter.hasParameterAnnotation(Payload.class); } @Override public Object resolveArgument(@NonNull MethodParameter parameter, @NonNull Message<?> message) { Class<?> parameterType = parameter.getParameterType(); String messageContent = (String) message.getPayload(); Object body; try { // 这里定义自己的解析方法 body = JsonUtils.fromJson(messageContent, parameterType); Objects.requireNonNull(body); } catch (Throwable cause) { throw new KafkaException("kafka 消息解析失败: 非法JSON字符串", cause); } // 可选,定义解析后的参数校验逻辑 validate(parameter, body); return body; } private void validate(MethodParameter parameter, Object target) { for (Annotation ann : parameter.getParameterAnnotations()) { Validated validatedAnn = AnnotationUtils.getAnnotation(ann, Validated.class); if (Objects.nonNull(validatedAnn) || ann.annotationType().getSimpleName().startsWith("Valid")) { ValidationUtils.valid(target); } } } }
到这里,一个类就把参数自动解析搞定了,接下来咱们看看怎么用。/** * 订单支付成功通知 * @Author 公众号:架构师修行录 */ @KafkaListener(topics = "oms.orderPaySuccess", groupId = "fms") public void orderPaySuccess(@Payload OrderPaySuccessEvent orderPaySuccessEvent) { // 已经自动解析Kafka消息为orderPaySuccessEvent参数 // TODO 完成解析成功后的业务操作 }
怎么样,代码是不是比原来简洁多了,香不香!
如果你对技术有追求,不想一直写业务代码,不妨把项目中所有需要手动解析参数的地方,替换成自定义方法参数解析器来实现~本文作者:Jensen
八年Java老兵,曾涉猎航空、电信、IoT、垂直电商、直播互动游戏产品研发,现就职于广州某知名电商企业,财务资金团队负责人。
小米主题设计师、手机输入法设计师、双键五笔创始人、ProcessOn特邀讲师。
技术公众号【架构师修行录】号主,专注于分享程序员日常/架构技术/职场干货,关注回复"职场"马上升职加薪。
2022年中国网络安全10件大事1国家互联网信息办公室等13部门修订发布网络安全审查办法1月4日,国家网信办国家发改委工信部公安部国安部财政部商务部中国人民银行国家市场监管总局国家广播电视总局中国证监会国家保密局
量子通信网络更近一步!我国科学家实现模式匹配量子密钥分发近日,中国科学技术大学潘建伟陈腾云等与清华大学马雄峰合作,首次在实验上实现了模式匹配量子密钥分发,相关研究成果日前发表在国际学术期刊物理评论快报上。量子密钥分发基于量子力学基本原理
网络中国节元宵元宵佳节,观山湖人这样过吃元宵赏花灯猜灯谜随着元宵节的到来,连日来,观山湖区各镇街道组织开展了形式多样内容丰富的元宵节主题活动,让居民们欢聚一堂,共庆佳节,在和谐喜庆祥和的氛围中感受传统文化魅力。百花湖镇
你只知道狂飙多好,却忽略了比拍摄更绝美,年初必去的呈坎!头条创作挑战赛截图来源网络谁的春节不是电视剧狂飙陪伴的呢?说实话,狂飙是实火啊!谁不是聊天三句话内必会聊到狂飙,抛开剧情人物,网友也被剧中那充满浓浓广府风味的街景,挂满斑驳岁月痕迹
湖北宜昌暗香浮动世间梅好又是一年春好处,恰似相逢花盛开阳光和煦,春光已至两岸春江水暖查收这份市区赏梅线路图赏梅色闻梅香品梅韵共赴梅好时光城东公园(峰回路转)一树花开最知春,一片花海半山红城东公园一百五十余
安阳桥庙会重启万人鲸背观澜2023年安阳桥庙会。(记者麻翛然摄)2023年安阳桥庙会。(记者李中华摄)徜徉安阳桥庙会安民安阳桥旧称鲸背桥,始建于元代惠宗至元年间(13351340年),是贯通洹河南北的官道。
润哥探游停摆三年后,出境团队游重启!济南旅行社重新启航记者程凌润年过了,春来了,该出发了!2月6日,停摆三年的出境团队游重启,山东国信国际旅行社董事长张晓国感慨道,快背上行囊迈开脚步,去领略世界的精彩吧。目前,全国相关出境旅游团队已经
湖北房县火龙出街闹元宵烟花秀点亮房县老街张弘昌摄中新网十堰2月6日电(许海芳樊术升胡传林)湖北房县5日晚(正月十五)举办大型烟花秀,火树银花映照下,一条条火龙顺势出街,喜闹元宵,为市民奉上一道道视觉盛宴
电动汽车初创公司Rivian正在研发电动自行车IT之家2月6日消息,据彭博社,Rivian首席执行官RJScaringe在上周五举行的公司全体会议上向员工介绍了他们的新项目电动自行车。他提到,这家初创公司目前已经有一小群工程师
港中文物理博士被传上亿年薪赴美现实中失业一年老父搬砖资助摘要39岁的刘本良极富野心,这位毕业于香港中文大学的物理材料学博士,过去数十年都致力于研究大问题,希望像尼古拉特斯拉一样做出跨时代的能源研究,聚集世界目光。漫长的自主研究历程里,他
512GB热销至安卓第一!一加11为何如此受宠,用户口碑给出真相现如今的手机应用和游戏,在经过一段时间的使用之后,对于存储空间的占用动不动就是好几个G,这对于手机的存储空间就提出了更多的要求。因此,越来越多的消费者用户在选购手机的时候都更倾向于