使用Java时可以用 Google Guava 中的 EventBus 来轻松实现,但是在go中暂无相似类库(可能有我不知道)。...文中的代码都放在 https://github.com/kakisong/eventbus-go 设计 由于goroutine天生的优势,所以在消息的转发过程会非常方便。...所以这里简单分为两个步骤: 监听函数的注册 接收到消息回调各个对应的监听函数 实现 监听函数的注册 由于我们想实现的是根据接收到的消息类型来决定消息转发的对应函数,这样使用起来就很方便,只需要确定监听的消息类型即可注册使用...go的反射效率不高,所以这里存放反射后的对象 监听并转发消息 完成了监听函数的注册之后,接下来就是对发送过来的消息进行处理 定义一个普通的channel,缓冲大小为100 var msgChan = make...来实现消息的监听与消费,对外暴露的只有两个方法,我们不用去定义topic,不用去处理通道,由消息类型来控制回调的监听函数,在项目中的轻量级使用应该是开箱即用的。
:最终就是在目标数据库表上执行PreparedStatement的execute***()方法;且在执行前会利用google-guava的EventBus发布BEFORE_EXECUTE的事件(执行完成后...的EventBus.post()提交事件 for (AbstractExecutionEvent event : events) { EventBusInstance.getInstance()...().post(each); } 接下来需要对并行执行后得到的结果集进行merge,下面的sharding-jdbc源码分析系列文章继续对其进行分析; EventBus 说明:EventBus是google-guava...提供的消息发布-订阅类库; google-guava的EventBus正确打开姿势: 发布事务:调用EventBus的post()–sharding-jdbc中发布事务:EventBusInstance.getInstance...().post(each); 订阅事务:调用EventBus的register()–sharding-jdbc中注册事务:EventBusInstance.getInstance().register(
异常处理 总结 参考 --- 前言 EventBus 是 Guava 的事件处理机制,是观察者模式(生产/消费模型)的一种实现。...> 引入依赖后,这里我们主要使用 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
最近使用guava的eventBus,记录下。...1、如何使用 List-1.1 import com.google.common.eventbus.AllowConcurrentEvents; import com.google.common.eventbus.AsyncEventBus...消息后,方法subscribe就会收到消息。...图3.1 AsyncEventBus的post实现 步骤6、7的代码如下List-3.1,可以看到List-2.2中涉及的invokeSubscriberMethod在这里使用。...= null) { e.subscriber.dispatchEvent(e.event); } } Reference: google guava版本27.0-jre源码 (
GET:内部实现是组拼Url的方式,http协议规定最大长度4kb,ie浏览器限制1kb POST和GET的区别比较了一下,多了几条信息 Content-Type:application/x-www-form-urlencoded...Content-Length:93 主体内容 只需修改上一节代码中的几个地方: 调用HttpURLConnection对象的setRequestMethod(“POST”)方法 调用HttpURLConnection...对象的setRequestProperty()方法,把上面的几条头信息加进去 拼接好内容比如 String data=”username=”+username,调用String对象的length()方法...()方法,得到byte[] service: /** * POST传递参数 * * @param username * @param password...); conn.setConnectTimeout(5000); //设置头信息 conn.setRequestMethod("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密钥一起返回
使用axios的坑 jQuery.ajax的post提交默认的请求头的Content-Type: application/x-www-form-urlencoded 而axios.post提交的请求头是...application/json是一个趋势,但是如果改一个旧项目,把jQuery.ajax全部换成axios.post时,需要对请求做一些配置。...改之前的代码: // 没有指定请求头的content-type var data = {age: 18}; $.ajax({ url: '', type: 'POST', data...data dataType: 'json', success: function(result) { // do something } }) 使用axios的代码...import axios from 'axios'; import qs from 'qs'; var data = {age: 18}; var url = ''; axios.post(
EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现,在应用中可以处理一些异步任务。...); } } Output: post the simple event. 2018-05-20 22:24:12:INFO main com.guava.eventbus.listeners.SimpleListener...("post the string event."); eventBus.post("I am String event"); System.out.println("post...the int event."); eventBus.post(1000); } } 结论:注册了一个Listener,使用eventBus发送消息它的父类的Subscribe...Subscriber 不同类型参数的Subscribe 本小节我们来测试一下,向EventBus发送消息后,当有多个不同类型的Subscribe时,它们是怎么进行通信的呢?
Guava提供的通用公共类封装了公共的操作方方法,不需要提供Future和ListenableFuture的扩展方法。...如上内容来自《Google Guava包的ListenableFuture解析 》,文章写的很棒。...神器 Guava 简化并发编程 的好处就提现出来了。...Sharding-JDBC 使用 Guava(没错,又是它)的 EventBus 实现了事件的发布和订阅。...例如, #listen() 订阅了 DMLExecutionEvent 事件 EventBus#post() 发布事件,同步调用订阅逻辑 ?
同时Laravel提供了一个全局帮助函数csrf_token来获取该Token值,因此只需在视提交图表单中添加 input hidden(表单隐藏域) 即可在请求中带上Token <input type...="hidden" name="_token" value="{{ csrf_token() }}" 今天有找打一个新的方法: 在表单form下填加一下代码 {{ csrf_field() }} 以上这篇解决...laravel 表单提交-POST 异常的问题就是小编分享给大家的全部内容了,希望能给大家一个参考。
Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计。...不再多的废话,直奔Guava EventBus主题。...首先Guava为我们提供了同步事件EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的,官方理由是并不想我们我们的使用方式。...订阅 首先EventBus为我们提供了register方法来订阅事件,Guava在这里的实现很友好,我们不需要实现任何的额外接口或者base类,只需要在订阅方法上标注上@Subscribe和保证只有一个输入参数的方法就可以搞定...正在这里对于Guava对于事件的发布,是依据上例中订阅方法的方法参数类型决定的,换而言之就是post传入的类型和其基类类型可以收到此事件。
EventBus是Google.Guava提供的消息发布-订阅类库,它实现了观察者设计模式,消息通知负责人通过EventBus去注册/注销观察者,最后由消息通知负责人给观察者发布消息。...,只能使用Integer,不能使用int,否则handlersByType的Class会是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消费这个消息队列,故系统重启之后,保存或者堆积在队列中的消息丢失。
所以guava在程序性能优化上下了不少的工夫,我们称其为单块架构的利器 我认为强大的有几点:1.集合处理 2.EventBus消息总线处理 3.guava cache 单机缓存处理 4.并发listenableFutrue...反射[Reflection] Guava 的 Java 反射机制工具类 1.Guava EventBus探讨 在设计模式中, 有一种叫做发布/订阅模式, 即某事件被发布, 订阅该事件的角色将自动更新。...首先单块架构就是在一个进程内, 在一个进程内, 我们还是希望模块与模块之间(功能与功能之间)是松耦合的,而在一个模块中是高度内聚的, 如何降低一定的耦合, 使得代码更加有结构, guava eventbus...如果认为缓存数据总是在固定时候后变得陈旧不可用,这种回收方式是可取的。...ListenableFuture的创建 对应JDK中的 ExecutorService.submit(Callable) 提交多线程异步运算的方式,Guava 提供了ListeningExecutorService
项目场景: 在项目开发中常常会遇到在一个有数据库操作的方法中,发送MQ消息,如果这种情况消息队列效率比较快,就会出现数据库事务还没提交,消息队列已经执行业务,导致不一致问题。...举个应用场景,我们提交一个订单,将流水号放在MQ里,MQ监听到后就会查询订单去做其它业务,如果这时候数据库事务还没提交,也就是没生成订单流水,MQ监听到消息就去执行业务,查询订单,肯定会出现业务不一致问题...问题描述 最近遇到一个业务场景,类似于下单过程,场景是用户注册消息,注册成功后,会发送MQ消息,MQ监听到消息后,会查询用户的信息,如何再做其它业务,但是遇到一个问题,就是mq消费消息的速度是快于数据库事务提交的...void afterCommit() { // 发送消息给MQ sendMQMessage(); } }); } 测试一下,通过日志可以看出事务已经提交了...,控制数据库的事务提交后,才执行发送MQ消息 补充: 如果执行出现java.lang.IllegalStateException: Transaction synchronization is not
协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须 使用什么编码方式 。...种类 1. application/x-www-form-urlencoded 这应该是最常见的 POST 提交数据的方式了。...浏览器的原生 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。...请求头内容类型为:Content-Type: application/x-www-form-urlencoded;charset=utf-8 提交的数据按照 key1=val1&key2=val2 的方式进行编码...一般的POST操作不指名类型时默认为该类型。 2. multipart/form-data 这也是常见的post请求方式,一般用来上传文件,各大服务器的支持也比较好。
找出未提交的MySQL线程/事务: SELECT * from information_schema.processlist; 这个能看到上面哪个SQL线程ID(下图的378号线程就是造成MDL锁的罪魁祸首...补充: 场景三: 通过show processlist看不到TableA上有任何操作,在information_schema.innodb_trx中也没有任何进行中的事务。...这很可能是因为在一个显式的事务中,对TableA进行了一个失败的操作(比如查询了一个不存在的字段),这时事务没有开始,但是失败语句获取到的锁依然有效,没有释放。...也就是说除了语法错误,其他错误语句获取到的锁在这个事务提交或回滚之前,仍然不会释放掉。...,因为错误的语句根本不会被记录到二进制日志。
---- 我们经常会碰到这样的情况,某个事务执行完了未提交,后续再来一个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如何找出未提交事务信息
后端获取不到axios.post提交的参数 官网示例是这样的: # 方式一:直接传入json对象作为参数 axios.post('/user', { firstName: 'Fred', lastName...console.log(error); }); 后端实现: request.getParameterMap(); request.getParameter("email"); 部署运行项目后,...解决方案: 首先要明白,axios的默认行为: axios 使用 post 发送数据时,默认是直接把 json 放到请求体中提交到后端的。...这时候,需要使用到 Qs模块了, 借助Qs模块来序列化前端的json对象,使之成为name=张三&age=18&email=zs@qq.com的形式提交:。...当然,熬得过后端德华,让他们改也是可以的。后端可以直接拿到json传转换成对象也是ok的。
# application/x-www-form-urlencoded 页面表单方式提交,编码为名称/值对 Content-Type:application/x-www-form-urlencoded...数据进行了URL转码 # multipart/form-data 上传文件时enctyped项必须为此值 # application/json 服务端消息主体是序列化后的JSON字符串 各大浏览器都原生支持...JSON.stringify 格式支持比键值对复杂得多的结构化数据 # ext/xml XML作为编码方式 典型XML-RPC请求: POST http://www.example.com HTTP
协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。...所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分。...application/x-www-form-urlencoded 这种方式应该是最常见的POST提交数据的方式了,在正常的form表单中如果不设置enctype,默认的提交方式就是application...multipart/form-data 这也是一个常见的post数据提交方式,当form表单中包含文件时,就必须采用这种提交方式来将文件提交到服务器上。...实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。
领取专属 10元无门槛券
手把手带您无忧上云