范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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特邀讲师。
  技术公众号【架构师修行录】号主,专注于分享程序员日常/架构技术/职场干货,关注回复"职场"马上升职加薪。

奥丽伊卡瓦洛亮相颁奖典礼,身穿橘色絮丝连身裙大气时尚近日,奥丽伊卡瓦洛(AuliiCravalho)亮相第20届年度亚裔美国人奖在比佛利山庄举行。当天,她身穿一件橘色的絮丝连身裙亮相,看起来显得很大气时尚,颜色也足够新颖,非常有魅力颁奖典礼千奇百怪的明星配饰海外奇遇见闻录第七期13款名人配饰成为红地毯上意想不到的明星在打造造型时,每个细节都很重要,名人深知这一点。戴头饰奢侈的包或一顶非常规的帽子都不足以在红地毯上脱颖而出。这就是为什么复出的田震好柔和,但我依旧记得当年的她为颁奖典礼不公怒摔话筒时光音乐会播了两期,艺绽君一直想说说常驻嘉宾田震,她时隔多年后在综艺上复出的状态,和我想得还真挺不一样的,和当年大闹颁奖典礼摔话筒的她相比,温和太多了。年轻一点的小伙伴,可能都不太2022第二十六届中国三亚天涯海角国际婚庆节年度颁奖典礼暨闭幕式圆满举办相约天涯海角,奔赴浪漫之约。12月18日晚,2022第二十六届中国三亚天涯海角国际婚庆节年度颁奖典礼暨闭幕仪式在天涯海角游览区举行。海风吹拂,星光点点,到场来宾共同见证9项婚庆旅游2022魅友大会官宣定档,除了颁奖典礼,还有全新魅友计划伴随着智能手机的发展普及,人们在享受科技带来的便利的同时,也遭遇了许多问题,其中隐私安全就是始终绕不开的话题。尤其是在这个大数据时代,手机厂商如何更好的保护用户用机安全,也就成为了别以为哈里王子是二哈,他暗示自己永远不会放弃王室头衔据每日星报1月9日消息,哈里王子愤怒地驳斥了他和妻子梅根应该放弃王室头衔的说法。在接受美国电视节目60分钟的采访时,他告诉采访者安德森库珀,他在回忆录备用中所写的一切都不是为了伤害张静初被造黄谣十几年终回应!眼眶通红数次哽咽,曾因此患抑郁症饿了吗?戳右边关注我们,每天给您送上最新出炉的娱乐硬核大餐!1月10日中午,张静初晒出一则最新视频,回应自己被造黄谣一事,她被此事困扰了十几年,如今终于等到法律的判决,然而造谣者却吴启华回忆留学时受歧视经历,感慨有国才有家(观察者网讯)据香港新闻网今日(10日)报道,近日,香港演员吴启华在受访时回忆年少时赴英读书备受种族歧视的经历,介绍称(他们)会叫你Chink(侮辱性词汇,指中国佬),逛街无端端被这或许是上海美影厂归来的最好时候犀牛娱乐原创文胖部编辑朴芳2023年的第一部口碑爆款,首推中国奇谭。面世不到十天,中国奇谭已经被众多声音认为是中国版爱死机。虽然这部充满中国传统文化和审美的故事,与爱,死亡,机器人中科院在CAA新结构的3DDRAM研究取得创新进展IT之家1月10日消息,据中科院微电子研究所消息,随着尺寸的不断微缩,1T1C结构动态随机存储器(DRAM)的存储电容限制问题愈发显著,导致传统1T1CDRAM面临微缩瓶颈。基于铟JavaEclipse如何调试代码下面通过一个简单的例子来了解一下Eclipse调试程序的方法。上述代码完成的主要功能是如果i值满足小于或等于5的条件,就一直执行输出语句。可以看到for关键字后面的小括号中有三个表
涨!7。24小麦价格行情7。24日,小麦价格继续上涨,但是早晨上涨面粉厂比昨天少了些,正常情况下,面粉厂价格调整主要在8点以后,因此,还不能对今天价格行情过早下定论,密切关注早8点以后小麦价格。先看看昨天舌苔怎么看湿气重不重?不同类型用药方案来了湿气重的人,舌苔通常看起来比较白厚,舌头大,看起来滑而湿润,伴有四肢沉重,食欲不振,大便不成形,溏稀,这时我们可以用参苓白术散。如果还觉得怕冷,疲乏困倦,面色发白,头晕头重,就要考莱蒂齐亚终于买新裙子,一件5200元印花裙温柔又舒适,真适合70后西班牙王后的节俭大家无人不知无人不晓,她总能把旧衣服穿出新意,重新搭配不同的首饰与配饰,就像穿的新衣服一样,然而人家毕竟是王室王后,添置新衣服年年有,却不是天天有,最新活动终于买新大伏天延庆野鸭湖半日游周末单位搞工会活动,上午去了延庆野鸭湖。天气很热,但是阴凉地还不错,小风吹着非常舒服!野鸭湖位于北京市延庆县西北部,属于华北平原向山西高原内蒙高原的过渡地带。官厅水库延庆辖区及环湖伏天出汗多,建议常吃5种高钾食物,应季而食,顺利度过伏天三伏天里的天气一天比一天热,天气热,人体就比较容易出汗,尤其是在户外,稍微运动一下就是一身汗。虽然说夏天多出汗对身体有一定的好处,但如果出汗过多的话会造成身体里钾元素的流失,很多朋老人摔一跤就骨折?提醒老人多补充2种营养,或降低33骨折风险在生活中,人们难免会出现摔倒的情况很多人摔倒后可能只是擦伤了表皮,但严重时还会使局部组织受伤,导致出现血肿,甚至发生骨折。尤其是对于老年人来说,摔倒是一件非常可怕的事情。据统计,在中国在又一个新兴科技领域领先美国,站在科技创新制高点近日国内自动驾驶领域领军者百度举行了2022百度世界大会,在会上百度发布新一代的自动驾驶汽车ApolloRT6,强调它的自动驾驶技术已居于全球领先地位,事实上这几年中国的自动驾驶企世锦赛大冷!4100米接力美国遭0。07秒绝杀丢金,德格拉塞大爆发北京时间7月24日,2022年俄勒冈田径世锦赛男子4100米决赛迎来较量,夺冠大热门美国队由于第四棒在交接时出现了瑕疵,结果被加拿大爆冷以0。07秒绝杀,丢掉了这枚金牌,而加拿大则大家都被美国海军骗了这么多年被神化的壮志凌云,其实可能对美国海军的征兵工作没啥大用长期以来,1986年上映的美国电影壮志凌云被美国海军宣传为最好的海军征兵宣传片,据说曾影响了大批美国青年踊跃参军,还让越战以来爆大冷!坐拥世界前3百米飞人,牙买加丢金,遭美国队0。04秒绝杀2022年田径世锦赛女子4100米决赛,牙买加队爆冷丢金,遭美国队0。04秒绝杀!美国队拿到金牌,牙买加队拿到银牌,德国队拿到铜牌!牙买加队拥有世界前3的百米女飞人,但最终丢掉了金女性贫血,易引发疾病的发生,常吃这8种食物,或能有效补血女性贫血是很常见的问题,导致女性贫血的因素有很多,比如怀孕期间经期等。这些时期消耗的血很多,因此十个女人中有九个都是贫血,其中最为常见的是缺铁性贫血。贫血还会引起身体其他几疾病的发