java spring eventbus_基于spring环境的eventbus

eventbus作为事件总线可以提供消费者的注册和事件的分发功能,是实现事件驱动的必要工具也是项目中的解耦利器。

本组件是基于greenrobot的eventbus包装,考虑到大部分项目都是基于spring开发,消费者提供了bean的自动注册。事件发布者也以单例bean的形式创建。

快速开始

maven依赖:

com.github.neusnail

spring-eventbus

1.0

配置发布器@Configuration

public class EventBusConfig {

@Bean

public EventPublisher eventPublisher() {

return EventPublisherBuilder.createDefault();

}

}

创建消费者和事件@EventSubscriber

@Slf4j

//用户行为事件消费者

public class UserBehaviorSubscriber {

@Subscribe()

public void userLeaveSubscriber(UserEntryEvent event) {

log.info("get userLeaveEvent userName:{}", event.getUserName());

}

@Subscribe(threadMode = ThreadMode.ASYNC, priority = 1)

public void userEntrySubscriber(UserLeaveEvent event) {

log.info("get userEntryEvent userName:{}", event.getUserName());

}

}@Data

@EqualsAndHashCode(callSuper = true)

public class UserEntryEvent extends BaseEvent {

private String userId;

private String userName;

}

开启消费者扫描

建议在main方法之后直接调用注册,也可以使用@EventListener、CommandLineRunner、实现aware等方式在容器启动后注册,但注意确保不要重复注册@SpringBootApplication

public class DemoApplication{

public static void main(String[] args) {

ApplicationContext context = SpringApplication.run(DemoApplication.class, args);

SubscriberRegister.register(context);

}

}

发送事件public void postEvent() {

UserEntryEvent userEntryEvent = new UserEntryEvent();

userEntryEvent.setUserName("bigBoss");

eventPublisher.post(userEntryEvent);

}

注意这里提供的postAsync是生产方的异步,决定权在生产者这里,threadmode是消费方的异步,决定权在消费者里

参数配置

在注册publisher bean时候可以配置部分参数@Configuration

public class EventBusConfig {

@Bean

public EventPublisher eventPublisher() {

return EventPublisherBuilder.builder()

.asyncPostExecutor(Executors.newFixedThreadPool(1))

.EventBus(EventBus.builder()

.throwSubscriberException(false)

.sendNoSubscriberEvent(true)

.executorService(Executors.newCachedThreadPool())

.build()

).build();

}

}

其中asyncPostExecutor是发布者异步发送时使用的线程池,eventbus中的executorService是消费者异步消费的线程池

默认的发送者和消费者线程池都使用了阿里的ttl线程池,避免父子线程传递问题private ExecutorService defaultExecutor() {

ThreadPoolExecutor executor = new ThreadPoolExecutor(

4, 8,

5L, TimeUnit.MINUTES,

new LinkedBlockingQueue(1000),

new ThreadPoolExecutor.CallerRunsPolicy()

);

return TtlExecutors.getTtlExecutorService(executor);

}

消费者线程模式和优先级

@subscribe中的threadmode有以下选项

ThreadMode.POSTING:和发送事件在同一个线程

ThreadMode.MAIN:主线程

ThreadMode.BACKGROUND:子线程

ThreadMode.ASYNC:异步线程

我们在javaweb的开发中一般只会使用ThreadMode.POSTING(同步)和ThreadMode.ASYNC(异步)

priority是优先级,数值越大越先被消费

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值