问题描述

我有一个智能回答自动回复的业务实现,因为项目用到了DDD开发模式,我为这个自动回复做了一个单独的领域,包是在xxx-xxx-xxx-domain包下,也就是领域层,问题是我自动回复领域处理完之后,要代理发送微信消息,发送消息MQ,还有更多的比如:推送WS,商机处理等等,最关键的是这个自动回复有特殊的规则,比如延时发送。发送消息的统一入口sendMsg恰好是在会话service接口中定义的,也就是xxx-xxx-xxx-application层,我这调不到,所以最后采用事件上报,我这里画图给你描述下

也就是说我需要用上层的服务

Google Guava解决

我们把上层需要的参数封装成一个事件对象,让我们的事件处理器发布事件

/**** 关键词自动回复上报Spring事件* @Author huacheng* @Date 2:59 下午 2021/12/20* @Param [xxxxMsgBO, second] second表示延迟秒数* @return void**/private void sendxxxxMsg(List<xxxMsgBO> xxxMsgBO,Integer second){xxxMsgEvent xxxMsgEvent = new xxxMsgEvent();xxxMsgEvent.setSendMsgBO(xxxxMsgBO);xxxMsgEvent.setSecond(second);eventBusHolder.postSync(xxxMsgEvent);}@Slf4j
@Component
public class EventBusHolder implements DisposableBean, ApplicationContextAware {private EventBus syncEventBus;/*** 发布同步事件*/public void postSync(Object event) {try {syncEventBus.post(event);} catch (Exception t) {log.error("unexpected sync post event failed, event:{}", event, t);}}//销毁@Overridepublic void destroy() throws Exception {xxxxPool.shutdown();if (!xxxPool.awaitTermination(30, TimeUnit.SECONDS)) {log.warn("force shutdown eventBusPool");xxxPool.shutdownNow();}}//初始化我们的处理器@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {xxxPool = new ThreadPoolExecutor(8, 8, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(10240),new BasicThreadFactory.Builder().namingPattern("event-bus-thread-%d").build(),(r, executor) -> log.warn("event discarded due to overflow"));asyncEventBus = new AsyncEventBus(eventBusPool, (exception, context) -> log.error("async event process failed with subscriber: {} method: {} event: {}",context.getSubscriber().getClass().getSimpleName(), context.getSubscriberMethod().getName(), context.getEvent(), exception));syncEventBus = new EventBus((exception, context) -> log.error("sync event process failed with subscriber: {} method: {} event: {}",context.getSubscriber().getClass().getSimpleName(), context.getSubscriberMethod().getName(), context.getEvent(), exception));applicationContext.getBeansWithAnnotation(EventProcessor.class).values().forEach(bean -> {log.info("register event-bus subscriber: {}", bean.getClass().getSimpleName());asyncEventBus.register(bean);syncEventBus.register(bean);});}
}

怎么配合

/*** 自动回复消息事件处理器* @author 花城* @version 1.0* @Description*/
@EventProcessor   //必须加
@Component
@Slf4j
public class xxxMsgEventHandler {//收到关键词自动回复时间上报动作,放入延迟队列@Subscribepublic void subscribe(AutoReplyMsgEvent event) {DelayQueueManager manager = DelayQueueManager.getInstance();DelayxxxxMsgWorker delayAutoReplySendMsgWorker = new DelayxxxxMsgWorker(event.getxxxMsgBO());manager.put(delayAutoReplySendMsgWorker,event.getSecond(), TimeUnit.SECONDS);}
}

然后我们现在已经到了application层,就可以做我们想做的操作了

@Subscribe注解

Eventbus 翻译过来就是事件总线,用于简化组件和组件,线程和线程之间的消息通信,可以捆成是 Handler + Thread 的替代品。
上面的代码说明了这点

EventBus可以将发布者和订阅者解偶,这就是EventBus最大的方便之处。

我们Subscribe注解标注后就成为了观察者
使用起来较为简单

  • 需要防止并发调用时,可在@Subscribe注解下再加上 @AllowConcurrentEvents
  • EventBus并未直接实现单例,可以根据自己的业务来随机应对
  • Subscribe的方法必须是Public的

Guava底层源码实现

这里找了一篇不错的博客
EventBus实现原理

实习成长之路:下层应用调不到上层方法怎么办?GoogleGuava事件上报来打配合相关推荐

  1. 广东工业大学电子工艺实习报告书(双路输出可调稳压电源)

    1. 实习目的 本次实习通过电子焊接电路板(洞洞板可调直流稳压电路与PCB小黄鸭收音机电路),训练对基本焊接工具.对万用表等测量工具的掌握:掌握手工焊接的方法:了解元器件的基础知识,如:电阻器,电容, ...

  2. 架构师成长之路(3)--如何成为架构师(方法)

    前言: 哲学家常思考的问题:" 我是谁?"" 我从哪里来?"" 要到哪里去?不只是哲学家,我想每个人都有自己对这三个问题的认知. 如果我们要成为架构师 ...

  3. 架构师成长之路(4)--架构师知识体系(方法)

    前言: 哲学家常思考的问题:" 我是谁?"" 我从哪里来?"" 要到哪里去?不只是哲学家,我想每个人都有自己对这三个问题的认知.如果我们要成为架构师, ...

  4. 【Linux成长之路】CentOS7查看Tomcat版本号的方法

    进入tomcat的bin目录下: 执行version.sh文件 ./version.sh

  5. Selenium成长之路-07简单对象定位之tag name方法

    继续学习元素定位:tag name 每个前端开发人员,都有自己的习惯,所以,不一定每一个开发人员都喜欢用id.name来做标签,所以我们就需要掌握其他的定位方法,例如tag name 下面我们继续来进 ...

  6. 如何成为一名架构师,架构师成长之路

    技术人人都是xx 父文章 人人都是面试_个人渣记录仅为自己搜索用的博客-CSDN博客 我的成长之路_个人渣记录仅为自己搜索用的博客-CSDN博客 相关文章 架构师好书推荐_个人渣记录仅为自己搜索用的博 ...

  7. JAVA程序员成长之路的总结

    JAVA程序员成长之路的总结 看了篇推荐贴,JAVA程序员成长之路的总结,大致适用于各种初级JAVA程序员规划借鉴之用, 原文地址http://tieba.baidu.com/p/2017010306 ...

  8. 十年风雨,一个普通程序员的成长之路(一)怀念:西安的小黑屋

    受大飞的文字及李莹大哥的影响,也写了篇自己毕业以来,十年生涯的回顾.还在沉默王二的文章激励下一鼓作气把公众号开通了,发了这篇公众号的首篇文章. 终于开通了自己第一个公众号,发表了第一篇文章.看着空白的 ...

  9. 刘知远、赵鑫、施柏鑫:AI青年科研人员成长之路

    整理 | 刘冰一 在6月2日举办的智源大会青源学术年会举办的一个圆桌"青年科研人员成长之路与经验分享"上,清华大学计算机系副教授刘知远.中国人民大学高瓴人工智能学院长聘副教授赵鑫. ...

  10. 写作—开启技术成长之路

    一.前言 作为一名程序员,经常在网络上查找各种各样的资料.此时,会检索到很多优秀的技术文章.一篇好的技术文章,可能不仅仅会解决我们的问题,更能在阅读的过程中带给我们一些美好的体验. 许多时候我们也憧憬 ...

最新文章

  1. 详细讲解np.cumsum()
  2. 重磅!苹果祭出大招:史上最强 Mac 发布,iPad OS 惊艳问世
  3. JUnit 5中的测试执行顺序
  4. 高通写号工具_高通推出桌面平台新ARM处理器并认为我们的电脑性能没必要那么高...
  5. 倒计时css和js html代码,手把手教你利用CSS和JS创建一个倒数计时器
  6. 【C语言笔记初级篇】第三章:函数与递归
  7. 2020五一建模C题:饲料混合加工问题完整论文(附录有代码)
  8. OBS录制的avi能够被imageJ打开吗?
  9. linux配额管理命令,Linux管理员配额管理
  10. C语言判断关系R是否为自反关系
  11. c语言char储存字符串,在c语言中char型数据在内存中的储存形式为什么
  12. Win2003可用序列号(标准版与企业版)
  13. 赤城新千禧计算机学校,今天,千禧宝宝如约而至
  14. 由浅入深MFC学习摘记--第三部分
  15. 把数据转化为JSON格式
  16. [SV] ignore_bins 用法
  17. 漫谈程序员(五)20年资深程序员编程经验分享
  18. Unhandled exception at 0x000007FEFD5C9E5D in OpenCV3.3_TestDemo.exe: Microsoft C++ exception: cv::Ex
  19. 基于mfc 组态软件_原来WinCC组态这么厉害!小瞧了
  20. Android Retrofit★

热门文章

  1. oracle删sequ_Oracle序列(Sequence)创建、使用、修改、删除
  2. 检测同心圆_两“心”携手,共抗心衰——“同心圆”心衰俱乐部走进临安图书馆~...
  3. 因为此网站使用了 hsts_HSTS原理及实践
  4. 谷粒商城:16.商城业务 — 首页
  5. 电子邮件是html文件吗,如何在电子邮件正文中嵌入HTML文件
  6. keras用cpu加速_GPU训练加速原理(附KerasGPU训练技巧)
  7. ORB-SLAM3 yaml文件介绍
  8. CLION CMAKE 缺-g 导致断点不执行(无效)
  9. python之tile函数,shape函数,argsort函数介绍
  10. 机器学习中的分类模型和回归模型