首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go 中类 Guava EventBus 实现

使用Java时可以用 Google Guava EventBus 来轻松实现,但是在go中暂无相似类库(可能有我不知道)。...文中代码都放在 https://github.com/kakisong/eventbus-go 设计 由于goroutine天生优势,所以在消息转发过程会非常方便。...所以这里简单分为两个步骤: 监听函数注册 接收到消息回调各个对应监听函数 实现 监听函数注册 由于我们想实现是根据接收到消息类型来决定消息转发对应函数,这样使用起来就很方便,只需要确定监听消息类型即可注册使用...go反射效率不高,所以这里存放反射对象 监听并转发消息 完成了监听函数注册之后,接下来就是对发送过来消息进行处理 定义一个普通channel,缓冲大小为100 var msgChan = make...来实现消息监听与消费,对外暴露只有两个方法,我们不用去定义topic,不用去处理通道,由消息类型来控制回调监听函数,在项目中轻量级使用应该是开箱即用

2.1K92

【死磕Sharding-jdbc】---路由&执行

:最终就是在目标数据库表上执行PreparedStatementexecute***()方法;且在执行前会利用google-guavaEventBus发布BEFORE_EXECUTE事件(执行完成...EventBus.post()提交事件 for (AbstractExecutionEvent event : events) { EventBusInstance.getInstance()...().post(each); } 接下来需要对并行执行得到结果集进行merge,下面的sharding-jdbc源码分析系列文章继续对其进行分析; EventBus 说明:EventBus是google-guava...提供消息发布-订阅类库; google-guavaEventBus正确打开姿势: 发布事务:调用EventBuspost()–sharding-jdbc中发布事务:EventBusInstance.getInstance...().post(each); 订阅事务:调用EventBusregister()–sharding-jdbc中注册事务:EventBusInstance.getInstance().register(

87030
您找到你想要的搜索结果了吗?
是的
没有找到

JAVA | Guava EventBus 使用 发布订阅模式

异常处理 总结 参考 --- 前言 EventBusGuava 事件处理机制,是观察者模式(生产/消费模型)一种实现。...> 引入依赖,这里我们主要使用 com.google.common.eventbus.EventBus 类进行操作,其提供了 register、unregister、post...(1); eventBus.post(2); eventBus.post("3"); 运行结果为 EventListener#listenInteger ->1 EventListener#listenInteger...,比如事务处理 EventBus 部分源码 public class EventBus { private static final Logger logger = Logger.getLogger...异步使用 通过上面的源码,可以看出只要将构造方法中 executor 换成一个线程池实现即可, 同时 Guava EventBus 为了简化操作,提供了一个简化方案即 AsyncEventBus EventBus

7.4K10

Egg 中获取 POST 提交数据

用过Koa码农都知道,在Koa中获取POST提交数据需要配置第三方中间件,而Egg继承于Koa,在这一方面做了优化,获取POST提交数据不需要再配置其它中间件了,并添加了安全机制 CSRF 防范...,在Egg中获取用户提交POST数据主要有以下两种方法。...第一种:在用户访问需要POST提交数据页面时,返回CSRF密钥,当用户提交数据时,将CSRF密钥一起返回,以下是具体实现。 1. 在router.js中配置路由。...this.ctx.csrf 用户访问这个页面的时候生成一个密钥 await this.ctx.render('home', { // 将密钥返回用户端,让用户提交返回... 第二种:在中间件中配置全局CSRF密钥,在需要提交POST数据页面添加一个隐藏表单域,当用户提交时,将CSRF密钥一起返回

1.5K30

Guava - EventBus(事件总线)

Guavaguava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式实现,让我们能在领域驱动设计(DDD)中以事件弱引用本质对我们模块和领域边界很好解耦设计。...不再多废话,直奔Guava EventBus主题。...首先Guava为我们提供了同步事件EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例,官方理由是并不想我们我们使用方式。...订阅 首先EventBus为我们提供了register方法来订阅事件,Guava在这里实现很友好,我们不需要实现任何额外接口或者base类,只需要在订阅方法上标注上@Subscribe和保证只有一个输入参数方法就可以搞定...正在这里对于Guava对于事件发布,是依据上例中订阅方法方法参数类型决定,换而言之就是post传入类型和其基类类型可以收到此事件。

1.4K20

Google EventBus 使用详解

EventBus是Google.Guava提供消息发布-订阅类库,它实现了观察者设计模式,消息通知负责人通过EventBus去注册/注销观察者,最后由消息通知负责人给观察者发布消息。...,只能使用Integer,不能使用int,否则handlersByTypeClass会是int而不是Intege * 而传入int msg参数在post(int msg)时候会被包装成Integer...String方法会被调用 EventBusCenter.post("post string method"); EventBusCenter.post(123);...EventBus使用注意问题: 1.代码可读性很差,项目中使用时候,从post地方,查询handle使用,都是使用ide搜索服务,问题很难定位,不如普通接口调用方便查询; 2....由于EventBus是将消息队列放入到内存中,listener消费这个消息队列,故系统重启之后,保存或者堆积在队列中消息丢失。

63730

初探Google Guava

所以guava在程序性能优化上下了不少工夫,我们称其为单块架构利器 我认为强大有几点:1.集合处理   2.EventBus消息总线处理  3.guava cache 单机缓存处理  4.并发listenableFutrue...反射[Reflection] Guava Java 反射机制工具类 1.Guava EventBus探讨 在设计模式中, 有一种叫做发布/订阅模式, 即某事件被发布, 订阅该事件角色将自动更新。...首先单块架构就是在一个进程内, 在一个进程内, 我们还是希望模块与模块之间(功能与功能之间)是松耦合,而在一个模块中是高度内聚, 如何降低一定耦合, 使得代码更加有结构, guava eventbus...如果认为缓存数据总是在固定时候变得陈旧不可用,这种回收方式是可取。...ListenableFuture创建 对应JDK中 ExecutorService.submit(Callable) 提交多线程异步运算方式,Guava 提供了ListeningExecutorService

1K20

数据库事务提交才发送MQ消息解决方案

项目场景: 在项目开发中常常会遇到在一个有数据库操作方法中,发送MQ消息,如果这种情况消息队列效率比较快,就会出现数据库事务还没提交,消息队列已经执行业务,导致不一致问题。...举个应用场景,我们提交一个订单,将流水号放在MQ里,MQ监听到就会查询订单去做其它业务,如果这时候数据库事务还没提交,也就是没生成订单流水,MQ监听到消息就去执行业务,查询订单,肯定会出现业务不一致问题...问题描述 最近遇到一个业务场景,类似于下单过程,场景是用户注册消息,注册成功,会发送MQ消息,MQ监听到消息,会查询用户信息,如何再做其它业务,但是遇到一个问题,就是mq消费消息速度是快于数据库事务提交...void afterCommit() { // 发送消息给MQ sendMQMessage(); } }); } 测试一下,通过日志可以看出事务已经提交了...,控制数据库事务提交,才执行发送MQ消息 补充: 如果执行出现java.lang.IllegalStateException: Transaction synchronization is not

59740

找出未提交MySQL线程事务

找出未提交MySQL线程/事务: SELECT * from information_schema.processlist;   这个能看到上面哪个SQL线程ID(下图378号线程就是造成MDL锁罪魁祸首...补充: 场景三: 通过show processlist看不到TableA上有任何操作,在information_schema.innodb_trx中也没有任何进行中事务。...这很可能是因为在一个显式事务中,对TableA进行了一个失败操作(比如查询了一个不存在字段),这时事务没有开始,但是失败语句获取到锁依然有效,没有释放。...也就是说除了语法错误,其他错误语句获取到锁在这个事务提交或回滚之前,仍然不会释放掉。...,因为错误语句根本不会被记录到二进制日志。

2.4K20

MySQL找出未提交事务信息

---- 我们经常会碰到这样情况,某个事务执行完了未提交,后续再来一个DDL和DML操作,导致后面的session要么处于waiting for metadata lock,要么是锁等待超时...这时我们往往只能找到这个未提交事务事务id和session id,但是一般都处于sleep状态,不好分析事务内容到底是什么,所以通常都是粗鲁地kill这个session解决问题,但是应用层研发人员往往找不到到底是哪个事务引起...一、processlist中提交事务 对于一个执行完但未提交事务,无法在show processlist输出中找到该信息: -- session 1 mysql> set autocommit...二、information_schema.innodb_trx中提交事务 同样,information_schema.innodb_trx.trx_query也为NULL,无法提供未提交事务...MySQL如何找出未提交事务信息

4.6K21

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券