依据不通音讯类型,进行不同的解决。
---------------------------重构前----------------------------------------------

@Overridepublic void onMessage(MapRecord<String, String, String> message) {     log.info("MessageId: {}", message.getId());     log.info("Stream: {}", message.getStream());     log.info("Body: {}", message.getValue());          Map<String, String> msgValueMap = message.getValue();     String type = msgValueMap.get("type"); // 音讯类型     if ("音讯类型1".equals(type)) {          // 音讯类型1解决  例:userService.save(...);     } else if ("音讯类型2".equals(type)) {          // 音讯类型2解决  例:roleService.delete(...);     } else if ("音讯类型3".equals(type)) {          // 音讯类型3解决  例:taskService.save(...);     }}

---------------------------重构后----------------------------------------------

@Autowiredprivate MessageHandlerContext messageHandlerContext;    @Overridepublic void onMessage(MapRecord<String, String, String> message) {     log.info("MessageId: {}", message.getId());     log.info("Stream: {}", message.getStream());     log.info("Body: {}", message.getValue());          Map<String, String> msgValueMap = message.getValue();     MessageInfo<String, String> messageIfo = new MassageInfo();     messageInfo.setType(msgValueMap.get("type"));     messageInfo.setData(msgValueMap.get("data"));     messageHandlerContext.handler(messageIfo);}

重构-1:

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documentedpublic @interface Message {    /** 音讯类型 */    String value();}public interface MessageHandler {    default String getType() {        return this.getClass().getAnnotation(Message.class).value();    }    @PostConstruct    default void register() {        MessageHandlerContext.register(this);    }    void handler(MessageInfo messageInfo);}@Slf4j@Componentpublic class MessageHandlerContext {    private static final Map<String, MessageHandler> MESSAGE_HANDLER_MAP = new HashMap<>();    public static void register(MessageHandler messageHandler) {        MESSAGE_HANDLER_MAP.put(messageHandler.getType(), messageHandler);        log.info("注册音讯解决:{}", messageHandler.getType());    }    public void handler(MessageInfo messageInfo) {        Optional.ofNullable(MESSAGE_HANDLER_MAP.get(messageInfo.getType()))                .orElseThrow(() -> new IllegalArgumentException("未辨认的音讯类型:" + messageInfo.getType()))                .handler(messageInfo);    }}@Datapublic class MessageInfo<T> {    /** 音讯类型 */    private String type;    /** 音讯内容 */    private T data;}

重构-2:

@Message("ExampleMessage")@Slf4j@Componentpublic class ExampleMessageHandler implements MessageHandler {    @Override    public void handler(MessageInfo messageInfo) {        log.debug("ExampleMessageHandler->handler:{}", messageInfo);    }}@Message("TestMessage")@Componentpublic class TestMessageHandler implements MessageHandler {    @Override    public void handler(MessageInfo messageInfo) {        log.debug("TestMessageHandler->handler:{}", messageInfo);    }}

测试:

@SpringBootTestclass DemoApplicationTests {    @Autowired    private MessageHandlerContext messageHandlerContext;    @Test    void contextLoads() {    }    @Test    public void testMessage() {        MessageInfo<String> testMessage = new MessageInfo<>();        testMessage.setType("TestMessage");        testMessage.setData("test");        messageHandlerContext.handler(testMessage);        MessageInfo<String> exampleMessage = new MessageInfo<>();        exampleMessage.setType("ExampleMessage");        exampleMessage.setData("example");        messageHandlerContext.handler(exampleMessage);    }}// 输入:// ......// 注册音讯解决:ExampleMessage// 注册音讯解决:TestMessage// ......// TestMessageHandler->handler:MessageInfo{type='TestMessage', data=test}// ExampleMessageHandler->handler:MessageInfo{type='ExampleMessage', data=example}