玩过 kafka 的小伙伴相信对 kafka 生产者和消费者的异步回调记忆犹新,不由的赞叹这种设计模式真的超赞,心想如果我也能写出这样的异步回调那该多好,今天他来了!!!

Callback

模仿 kafka 的这个接口用于接收回调信息

package demo;import java.util.Map;public interface Callback {void onCompletion(Map<String, String> offset, Exception exception);
}

ReomteServer

这个就相当于 kafka 实际发消息的类,将消息异步发送(也可以同步)给服务器后返回元数据信息。首先分析一下既要异步也要支持同步那就需要使用 Future 类了,利用它的 get() 方法实现同步即可!!!

package demo;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;public class RemoteServer<T> {private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public Future<Map<String, String>> send(T message) {return send(message, null);}public Future<Map<String, String>> send(T message, Callback callback) {FutureTask<Map<String, String>> futureTask = new FutureTask<>(() -> {if (callback != null) {if ("error".equals(message)) {callback.onCompletion(null, new RuntimeException(sdf.format(new Date())+"因为你发了error,所以报错了"));} else {callback.onCompletion(getMap(message), null);}}return getMap(message);});new Thread(futureTask).start();return futureTask;}public Map<String, String> getMap(T message) {HashMap<String, String> map = new HashMap<>();map.put("message", message.toString());map.put("offset", message.hashCode() + "");map.put("time", sdf.format(new Date()));return map;}
}

这样一个简单的异步回调就完成啦。

LocalServer

本地测试

正常消息异步发送+回调

package demo;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ExecutionException;public class LocalServer {public static void main(String[] args) throws ExecutionException, InterruptedException {String message = "message";RemoteServer<String> remoteServer = new RemoteServer<>();for (int i = 0; i < 10; i++) {remoteServer.send(message, new Callback() {@Overridepublic void onCompletion(Map<String, String> offset, Exception exception) {if (null == exception) {System.out.println(offset);} else {exception.printStackTrace();}}});System.out.println(new Date() + "发过去了");}}
}

测试结果

正常消息同步发送

package demo;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ExecutionException;public class LocalServer {public static void main(String[] args) throws ExecutionException, InterruptedException {String message = "error";RemoteServer<String> remoteServer = new RemoteServer<>();for (int i = 0; i < 10; i++) {System.out.println(remoteServer.send(message).get());System.out.println(new Date() + "发过去了");}}
}

错误消息异步发送+回调

package demo;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ExecutionException;public class LocalServer {public static void main(String[] args) throws ExecutionException, InterruptedException {String message = "error";RemoteServer<String> remoteServer = new RemoteServer<>();for (int i = 0; i < 10; i++) {remoteServer.send(message, new Callback() {@Overridepublic void onCompletion(Map<String, String> offset, Exception exception) {if (null == exception) {System.out.println(offset);} else {exception.printStackTrace();}}});System.out.println(new Date() + "发过去了");}}
}

手写 kafka 异步回调相关推荐

  1. 阿里P8架构大神分享纯手写“kafka文档”看完直呼太牛!

    什么是 Kafka Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区.多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系 ...

  2. python3多进程写Kafka异步线程调用接口

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author: 风过无言花易落 # @Date : 2022/02/14 22:30 # @Desc ...

  3. promise 浏览器实现的源码_【大前端01-01】函数式编程与JS异步编程、手写Promise...

    [简答题]一.谈谈你是如何理解JS异步编程的,EventLoop.消息队列都是做什么的,什么是宏任务.什么是微任务? 如何理解JS异步编程 众所周知JavaScript语言执行环境是"单线程 ...

  4. 前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端进阶高薪必看-手写源码篇(高频技术点)...

    前言 此系列作为笔者之前发过的前端高频面试整理的补充 会比较偏向中高前端面试问题 当然大家都是从新手一路走过来的 感兴趣的朋友们都可以看哈 初衷 我相信不少同学面试的时候最怕的一个环节就是手写代码 大 ...

  5. 【学习笔记】Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程、手写 Promise(二、JavaScript 异步编程)

    [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程.手写 Promise(课前准备) [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步 ...

  6. mysql异步查询 java_java 手写并发框架(一)异步查询转同步的 7 种实现方式

    序言 本节将学习一下如何实现异步查询转同步的方式,共计介绍了 7 种常见的实现方式. 思维导图如下: 异步转同步 业务需求 有些接口查询反馈结果是异步返回的,无法立刻获取查询结果. 比如业务开发中我们 ...

  7. 并发查询_java 手写并发框架(一)异步查询转同步的7种实现方式

    序言 本节将学习一下如何实现异步查询转同步的方式,共计介绍了 7 种常见的实现方式. 思维导图如下: 思维导图 异步转同步 业务需求 有些接口查询反馈结果是异步返回的,无法立刻获取查询结果. 比如业务 ...

  8. react 日期怎么格式化_手写React的Fiber架构,深入理解其原理

    熟悉React的朋友都知道,React支持jsx语法,我们可以直接将HTML代码写到JS中间,然后渲染到页面上,我们写的HTML如果有更新的话,React还有虚拟DOM的对比,只更新变化的部分,而不重 ...

  9. 手写webpack系列一:了解认识loader-utils

    Created By JishuBao on 2019-03-29 12:38:22 Recently revised in 2019-04-01 12:38:22   欢迎大家来到技术宝的掘金世界, ...

最新文章

  1. 18个最新的极简主义风格网站
  2. cordova开发中,android端利用百度sdk定位。
  3. c++ list box 字体设置_上海印刷字体展示馆 迎来第一批团队参观
  4. python库(包)查找网站
  5. pycharm 类型注释_学习Python第一步,变量与数据类型
  6. HTML5 Canvas 画纸飞机组件
  7. w7重启计算机打印机无法使用,win7系统电脑重启打印机服务就会被关闭的解决方法...
  8. 【Python】圆周率的计算
  9. 怎么删除python3.7注册表内容_python3操作注册表的方法(Url protocol)
  10. matlab图像分类器,Matlab 基于svm的图像物体分类
  11. redis 了 什么地方用到_细节拉满!美团首推“百万级”Redis进阶笔记究竟有什么魅力...
  12. AWT_事件监听2(Java)
  13. GitHub 引入缺陷和Pull Request 模版,并支持直接上传文件
  14. 如何卸载删除sql2005
  15. linux 服务器 告警声,服务器故障,报警声汇总
  16. 宁波诺丁汉大学计算机学院官网,宁波诺丁汉大学电子通讯及计算机工程(含实习)硕士课程...
  17. 如何进入大数据领域,学习路线是什么?
  18. 《工程伦理》网课第二章课后习题答案
  19. ng Baidu Baidu Baidu ang
  20. Django-admin后台LOGO字样修改方法

热门文章

  1. 投资理财-关于车的事情
  2. 2018全国高职计算机大赛,教育部关于公布2018年全国职业院校技能大赛(常规赛项)获奖名单的通知...
  3. eTom学习浅显理解
  4. WDS批量部署Windows系统
  5. sourceinsight4设置
  6. python的count函数_python中count函数的用法详解
  7. vs Installer 安装vs 下载速度为0 解决方案
  8. CSS3之color属性
  9. java常见并发容器
  10. 开心截图js 复习,让梦想照进现实哈