Guarded Suspension 模式

考虑一个场景,当两个服务通过MQ进行交互时,服务A生产消息,服务B消费消息,两者为异步操作,我们如何来保证A消费到B返回的结果呢?

Guarded Suspension模式

所谓 Guarded Suspension,直译过来就是“保护性地暂停”。

Guarded Suspension模式的结构图如下,其中包含:

  • 一个受保护的对象GuardedObject
  • 两个成员方法:get(Predicate p)onChanged(T obj)方法

GuardedObject 是管程的一个经典用法,将等待-通知机制展现得淋漓尽致。我们只需要检查条件变量的状态,来判断“受保护对象”是否能被访问即可。

核心实现:

  • get(Predicate p) 通过条件变量的await()实现等待
  • onChanged() 通过条件变量的signalAll()实现唤醒功能
class GuardedObject<T> {// 受保护的对象T obj;final Lock lock = new ReentrantLock();final Condition done = lock.newCondition();final int timeout = 1;// 获取受保护对象T get(Predicate<T> p) {lock.lock();try {//MESA管程推荐写法while(!p.test(obj)) {done.await(timeout,TimeUnit.SECONDS);}} catch (InterruptedException e) {throw new RuntimeException(e);} finally {lock.unlock();}// 返回非空的受保护对象return obj;}// 事件通知方法void onChanged(T obj) {lock.lock();try {this.obj = obj;done.signalAll();} finally {lock.unlock();}}
}

扩展Guarded Suspension模式

我们来模拟消息消费场景,

    //处理浏览器发来的请求Respond handleWebReq() {// 创建一消息Message msg = newMessage("1", "{...}");// 发送消息send(msg);//利用GuardedObject实现等待GuardedObject<Message> go=new GuardObjec<>();Message r = go.get(t->t != null);}void onMessage(Message msg) {//如何找到匹配的goGuardedObject<Message> go =  go.onChanged(msg);}

服务A处理web请求,向MQ发送消息,等待消息反馈结果;服务B消费消息,向MQ反馈结果。

那么服务B消费消息后,如何通知服务A呢?我们需要找到Message对应的GuardedObject对象。

这里我们在GuardedObject中维护一个Map,用以映射消息和受保护对象的关系。

class GuardedObject<T> {// 受保护的对象T obj;final Lock lock = new ReentrantLock();final Condition done = lock.newCondition();final int timeout = 2;//保存所有GuardedObjectfinal static Map<Object, GuardedObject> gos = new ConcurrentHashMap<>();//静态方法创建GuardedObjectstatic <K> GuardedObject create(K key) {GuardedObject go = new GuardedObject();gos.put(key, go);return go;}// 消费static <K, T> void fireEvent(K key, T obj){GuardedObject go = gos.remove(key);if (go != null) {go.onChanged(obj);}}// 事件通知方法void onChanged(T obj) {lock.lock();try {this.obj = obj;done.signalAll();} finally {lock.unlock();}}// 获取受保护对象T get(Predicate<T> p) {lock.lock();try {//MESA管程推荐写法while(!p.test(obj)){done.await(timeout,TimeUnit.SECONDS);}} catch(InterruptedException e) {throw new RuntimeException(e);} finally {lock.unlock();}//返回非空的受保护对象return obj;}
}
  • create 创建 GuardedObject,并统一管理
  • fireEvent 触发消费,改变条件变量状态
  • get 获取消费结果

Guarded Suspension 模式本质上是一种等待唤醒机制的实现,只不过Guarded Suspension 模式将其规范化,通常我们会根据实际场景扩展使用。

Guarded Suspension模式相关推荐

  1. 实战并发编程 - 08基于Guarded Suspension模式优化轮询while(true)

    文章目录 Guarded Suspension模式简介 看牙医的就诊流程 代码举例 总结与拓展 Guarded Suspension模式简介 guarded在这里是"保护"的意思: ...

  2. Java并发编程实战~Guarded Suspension模式

    Guarded Suspension 模式 比如,项目组团建要外出聚餐,我们提前预订了一个包间,然后兴冲冲地奔过去,到那儿后大堂经理看了一眼包间,发现服务员正在收拾,就会告诉我们:"您预订的 ...

  3. 并发设计模式之Guarded Suspension模式

    - 原文链接: http://www.joyhwong.com/2016/11/19/并发设计模式之guarded-suspension模式/ Guarded Suspension意为保护暂停,其核心 ...

  4. 多线程模式(2):Guarded Suspension模式

    为什么80%的码农都做不了架构师?>>>    封装请求类 package com.xqi.g_s;import com.xqi.f.Data;/*** 请求封装* * @autho ...

  5. 实战并发编程 - 09多线程Guarded Suspension模式案例实战

    文章目录 需求 Code (上) [1. init初始化报警服务] [2.onConnected方法建立连接] [3.HeartbeatTask心跳检查] [4.tesConnection测试是否连接 ...

  6. java暂挂状态,Guarded Suspension(保护性暂挂)模式

    思维导图 思维导图 Guarded Suspension 模式简介 Guarded Suspension 模式的核心是一个受保护方法(Guarded Method).该方法在执行其所需要真正执行的操作 ...

  7. Java高并发编程详解系列-Guarded Suspension设计模式

    导语   什么是Guarded Suspension模式,Suspension 意思是挂起,暂停的.而Guarded则表示担保的意思,连起来的就是确保挂起.也就是说当线程访问某个对象的时候,发现条件不 ...

  8. 并发设计模式——保护性暂停(Guarded Suspension)

    并发设计模式--保护性暂停(Guarded Suspension) 什么叫做 Guarded Suspension ? guarded 的意思是"守护.担保",suspension ...

  9. (Guarded Suspension Design Pattern)

    多线程设计模式之保护性暂停模式 定义 保护性暂停模式(Guarded Suspension Design Pattern):当线程在访问某个对象时,发现条件不满足时,就暂时挂起等待条件满足时再次访问. ...

  10. 实战并发编程 - 10Guarded Suspension模式在BlockingQueue源码中应用

    文章目录 Pre Another Case 源码分析 概 继承关系 核心方法 非阻塞式方法(offer . add) offer(E e) add(E e) 阻塞式方法 (put(E e) / tak ...

最新文章

  1. C++乘法的int越界问题
  2. 四因素三水平正交试验表_机制砂中不同因素对混凝土性能影响研究
  3. 游戏的革命从虚拟现实开始
  4. NYOJ 891 找点
  5. Android之MVVM框架 - 数据绑定
  6. 花前月下网易云等级代挂多功能助手程序v1.2
  7. java eml解析_javamail 收邮件 解析eml文件
  8. ssrs 存储过程参数配置_如何为纯模式配置报告服务(SSRS)
  9. Barefoot和Stordis在欧洲领导开源网络
  10. 学完计算机绘图收获有哪些,概率论与数理统计热合买提江网课参考答案查询,画法几何及土木工程制图计算机绘图...
  11. 计算机用户密码开机设置,计算机开机密码和屏保密码设置指南
  12. 移动营业厅办业务发现的几个需改问题(转
  13. 疫情下的大数据力量:多地政府借力大数据技术,多家企业上马大数据产品
  14. You Apple Developer Program membership expires in 12 days
  15. VBA中byref类型不匹配 ByRef Argument Type Mismatch错误
  16. Qiyuan-python接小球游戏2.0
  17. CM系统应用源码分析与rom定制
  18. 【软件测试】盘一盘工作中遇到的 MQ 异常测试
  19. 【BZOJ4372】烁烁的游戏(点分树)
  20. Jlink在ADS下的配置说明及常见问题解决办法

热门文章

  1. 快速使用easy rule
  2. win7打开chm文件显示“已取消到该网页导航”
  3. centos6查看运行服务器,centos如何查看端口是否开放_网站服务器运行维护,centos,端口...
  4. 安装VS2008的时候Windows Mobile 5.0 SDK R2 for pocket pc错误解决方案
  5. 数据库索引的填充因子
  6. CF1108D Diverse Garland
  7. #读书笔记—《自控力》第一章
  8. 网管系统测试学习——传输网下一代综合网管系统测试
  9. Oracle:Locked by transaction: console [表名]
  10. 【NLP技术】:NLP简单介绍