首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >番石榴异步事件总线侦听器按顺序被触发。

番石榴异步事件总线侦听器按顺序被触发。
EN

Stack Overflow用户
提问于 2022-06-29 14:02:57
回答 1查看 195关注 0票数 0

我正在开发一个Java应用程序,它发出应该异步处理的事件,因为事件处理依赖于IO,我希望它与核心逻辑分离。

我正在为这个用例尝试番石榴EventBus。为了启用异步事件处理,我在缓存的线程池执行器中使用AsyncEventBus。

当触发多个事件时,事件侦听器似乎按顺序执行,尽管运行在不同的线程上。

事件生成器类

代码语言:javascript
复制
public class MyEventEmitter {
    private static final Logger logger = LogManager.getLogger(MyEventEmitter.class);
    private EventBus eventBus;
    public MyEventEmitter(EventBus eventBus) {
        this.eventBus = eventBus;
    }
    public void emitEvent() {
        logger.info("[TEST] Emitting event");
        eventBus.post("String event");
        eventBus.post("String event");
        eventBus.post("String event");
        eventBus.post("String event");
    }
}

事件侦听器类

代码语言:javascript
复制
public class EventListener {

    private static final Logger logger = LogManager.getLogger(EventListener.class);
    private static int eventsHandled;
    private EventBus eventBus;
    public EventListener(EventBus eventBus) {
        this.eventBus = eventBus;
        this.eventBus.register(this);
    }

    @Subscribe
    public void stringEventDelayed(String event) throws InterruptedException{
        eventsHandled++;
        logger.info("[TEST] Async Event START " + event);
        Thread.sleep(1000);
        logger.info("[TEST] Async Event END " + event);

    }
}

EventBus设置

代码语言:javascript
复制
public class MainModule extends AbstractModule {

    @Override
    protected void configure() {
    }

    @Provides
    public EventListener getEventListener(EventBus eventBus){
        return new EventListener(eventBus);
    }

    @Singleton
    @Provides
    public EventBus getEventBus(){
        return new AsyncEventBus(Executors.newFixedThreadPool(4));
    }

    @Provides
    public MyEventEmitter getMyEventEmitter(EventBus eventBus){
        return new MyEventEmitter(eventBus);
    }
}

输出日志如下所示:

代码语言:javascript
复制
[INFO ] 2022-06-29 19:26:22.333 [main] EventListener - [TEST] EventListener setup
 [INFO ] 2022-06-29 19:26:22.345 [main] MyEventEmitter - [TEST] Emitting event
 [INFO ] 2022-06-29 19:26:22.346 [pool-2-thread-1] EventListener - [TEST] Async Event START String event
 [INFO ] 2022-06-29 19:26:23.348 [pool-2-thread-1] EventListener - [TEST] Async Event END String event
 [INFO ] 2022-06-29 19:26:23.348 [pool-2-thread-4] EventListener - [TEST] Async Event START String event
 [INFO ] 2022-06-29 19:26:24.353 [pool-2-thread-4] EventListener - [TEST] Async Event END String event
 [INFO ] 2022-06-29 19:26:24.359 [pool-2-thread-3] EventListener - [TEST] Async Event START String event
 [INFO ] 2022-06-29 19:26:25.361 [pool-2-thread-3] EventListener - [TEST] Async Event END String event
 [INFO ] 2022-06-29 19:26:25.361 [pool-2-thread-2] EventListener - [TEST] Async Event START String event
 [INFO ] 2022-06-29 19:26:26.364 [pool-2-thread-2] EventListener - [TEST] Async Event END String event

如上文所示,所有异步侦听器似乎都是一个接一个地执行,而不是并发执行。

我尝试过更改执行程序类型,尝试在本地调试,并尝试搜索,但是找不到任何特定于我的问题的内容。

EN

回答 1

Stack Overflow用户

发布于 2022-10-17 18:54:38

来自EventBus Javadocs:

EventBus保证不会同时从多个线程调用订阅者方法,除非该方法通过携带AllowConcurrentEvents注释显式地允许它。如果这个注释不存在,订阅者方法不需要担心被重入,除非也是从EventBus外部调用的。

您应该用@AllowConcurrentEvents注释订阅者方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72802738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档