成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Kafka封裝之—方法參數解析器,用起來真香!

開發 架構
咱們在寫Kafka消費者的時候,有沒有發現一個很麻煩的事:消費消息前每次都要手動解析Kafka消息,轉換成自己想要的類型,再進行業務操作

大家好,我是Jensen。一個想和大家一起打怪升級的程序員朋友。

咱們在寫Kafka消費者的時候,有沒有發現一個很麻煩的事:消費消息前每次都要手動解析Kafka消息,轉換成自己想要的類型,再進行業務操作,比如:

/**
* 訂單支付成功通知
* @Author 公眾號:架構師修行錄
*/
@KafkaListener(topics = "oms.orderPaySuccess", groupId = "fms")
public void orderPaySuccess(ConsumerRecord<String, String> consumerRecord) {
// 解析Kafka消息
OrderPaySuccessEvent event = JSON.parseObject(consumerRecord.value(), OrderPaySuccessEvent.class);
// TODO 完成解析成功后的業務操作
}

對代碼有潔癖的同志就比較難受了,每次解析的操作都差不多,但這又不是業務代碼……于是你就想:有沒有一個辦法讓系統能夠自動解析成自己想要的參數對象呢?

圖片

不過也發現了一些難以解決的問題,比如:共用了一個groupId,使用Java線程池來管理,這樣工程會存在性能瓶頸。

專業的事還是交給專業的“人”來做吧,用Kafka組件本身來管理不同分組消費會更靠譜。

Spring官方也發現這個問題,并且對此提出了解決方案——spring-messaging包下的HandlerMethodArgumentResolver接口。

圖片

我們從官方文檔中看到,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 完成解析成功后的業務操作
}

怎么樣,代碼是不是比原來簡潔多了,香不香!

如果你對技術有追求,不想一直寫業務代碼,不妨把項目中所有需要手動解析參數的地方,替換成自定義方法參數解析器來實現~

責任編輯:姜華 來源: 架構師修行錄
相關推薦

2021-06-30 09:20:18

NuShell工具Linux

2021-03-10 09:54:43

RustNuShell系統

2022-05-22 21:16:46

TypeScriptOmit 工具

2024-05-21 10:28:51

API設計架構

2020-12-02 10:13:45

JacksonJDK解析器

2021-03-18 10:56:59

SpringMVC參數解析器

2022-11-18 08:32:23

spring參數解析器

2022-11-07 09:25:02

Kafka存儲架構

2021-03-16 10:39:29

SpringBoot參數解析器

2022-07-11 10:37:41

MapPart集合

2009-03-19 09:26:05

RSS解析器MagpieRSS

2010-02-22 13:38:50

Python解析器

2010-02-22 16:51:03

Python 解析器

2024-07-04 11:33:33

2012-07-11 09:34:39

微軟云計算

2022-05-11 10:45:21

SpringMVC框架Map

2014-05-06 09:27:54

2022-02-14 13:58:32

操作系統JSON格式鴻蒙

2011-11-28 15:40:52

wiresharkRDP解析器

2021-09-18 08:52:45

人工智能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.男人天堂.com | 久久精品国产精品青草 | 欧洲亚洲视频 | 亚洲国产精品视频 | 欧美精品1区2区3区 精品国产欧美一区二区 | 中文字幕一区二区在线观看 | 国产精品久久久久久婷婷天堂 | 看av网址 | 成人在线视频免费看 | 一区欧美 | 99在线视频观看 | 成人国产在线视频 | 久久久久国产 | 一级免费在线视频 | 99久久婷婷国产综合精品电影 | 中文久久 | 午夜私人影院 | 中文字幕在线观看www | 精品一区二区三区四区在线 | 午夜视频一区 | 久久久久久久久国产精品 | 久久高清免费视频 | 精品美女久久久久久免费 | 国产在线观看一区二区三区 | 超碰97人人人人人蜜桃 | 亚洲色欲色欲www | 毛片免费看 | 日韩三区在线观看 | 成人在线观看网站 | 国产一区在线免费观看视频 | 国产一区二区久久 | www国产亚洲精品 | 男人天堂久久久 | 青青久在线视频 | 日韩中文字幕一区二区 | 一级黄色影片在线观看 | 羞羞视频在线观免费观看 | 7777在线| 国产精品二区三区 | 999久久久免费精品国产 | 国产免费一区二区三区 |