trace com.google.common.eventbus.Subscriber invokeSubscriberMethod 从结果来看,invokeSubscriberMethod执行时间要200ms+,也200ms的开销也就是线程抢占所等待的时间,到此问题已经确认。 结论:Google guava中的AsyncEventBus组件默认是同步处理,使用多线程但未设置@AllowConcurrentEvents会出现多线程之间的抢锁情况,导致业务...
value中包含被监听的bus,被监听的bus中的执行器,监听该bus的对象listener,以及监听参数类型的方法。 会去检查订阅方法上有没有注解AllowConcurrentEvents,如果有该注解,在使用create方法创建订阅者对象时,订阅者对象使用Subcriber,如果没有注解使用SynchronizedSubscriber对象。这两种对象在真正分发事件时区别才会体现出来。 ...
EventBus实例保证在同时不会有多个线程调用,除非这个方法通过@AllowConcurrentEvents注解明确允许。如果这个注解没有出现,订阅者方法也无需担心方法被重入,除非在EventBus实例之外有代码调用该方法。 死事件 如果一个事件被提交了,但是没有相应的订阅者接受它,就可以认为这是一个死事件。然后会给系统一个机会来处理这个...
Exception in thread "main" com.google.common.util.concurrent.UncheckedExecutionException: java.lang.IllegalArgumentException: Method public void com.study.eventbus.DataObserver1.func(java.lang.String,java.lang.String) has @Subscribe annotation but has 2 parameters.Subscriber methods must have exactly 1...
package TestEventBus.util;import com.google.common.eventbus.AsyncEventBus;import com.google.common.eventbus.EventBus;import java.util.concurrent.Executor;/*** @author fengjiale* @create 2019-09-04 13:55* @desc 事件总线工具类**/public class EventBusUtil {private static EventBus eventBus;priva...
import com.google.common.eventbus.AllowConcurrentEvents; import com.google.common.eventbus.Subscribe; /** * @author minsikun */ public class MessageListener { /** * 注解@AllowConcurrentEvents是用来标识当前订阅者是线程安全的 * Guava会对listener对象,遍历其带有@Subscribe注解的所有方法,然后对针对每一...
import com.google.common.eventbus.EventBus; import java.util.concurrent.Executor; /** * @author fengjiale * @create 2019-09-04 13:55 * @desc 事件总线工具类 **/ public class EventBusUtil { private static EventBus eventBus; private static AsyncEventBus asyncEventBus; ...
可以看出EventBus使用的事件分发器是Dispatcher.perThreadDispatchQueue(),重点executor执行器是MoreExecutors.directExecutor()。下面我们看下guava的包com.google.common.util.concurrent下的类MoreExecutors的该方法源码。 publicstaticExecutordirectExecutor(){returnMoreExecutors.DirectExecutor.INSTANCE;}// guava实现了java...
importcom.google.common.eventbus.AllowConcurrentEvents;importcom.google.common.eventbus.AsyncEventBus;importcom.google.common.eventbus.Subscribe;importorg.junit.Before;importorg.junit.Test;importjava.util.concurrent.Executors;importjava.util.concurrent.TimeUnit;publicclassEventBusTest{privateAsyncEventBus asyn...
{ private Logger logger = LoggerFactory.getLogger("birdie") ; @Override @Subscribe @AllowConcurrentEvents public void action(SystemEvent event) { logger.info(String.format("[MemberDeletedEventListener ] action event=%s", event.toString())); MemberDeletedEvent subEvent = (MemberDeletedEvent) event...