Spring事件异步使用简易教程

本文介绍了Spring事件处理机制,包括ApplicationEvent、ApplicationEventPublisherAware和ApplicationListener的使用。重点讲解了如何将事件处理变为异步,通过添加@Async注解、启用任务调度以及配置executor来实现。

spring事件发送监听由3个部分组成

1.ApplicationEvent:表示事件本身,自定义事件需要继承该类

2.ApplicationEventPublisherAware:事件发送器,需要实现该接口

3.ApplicationListener<T>:事件监听器接口


注意!默认情况下是同步的,事件被publish后会等待Listener的处理

以下是实现代码

ApplicationEvent

public class MessageEvent extends ApplicationEvent {
    public MessageEvent(Object source) {
        super(source);
    }
}

ApplicationEventPublisherAware

@Component
public class EventPublisher implements ApplicationEventPublisherAware {

    private static ApplicationEventPublisher applicationEventPublisher;

    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        EventPublisher.applicationEventPublisher = applicationEventPublisher;
    }

    public static void publishEvent(ApplicationEvent applicationEvent) {
        applicationEventPublisher.publishEvent(applicationEvent);
    }
}

ApplicationListener<T>,在监听中sleep一会,使同步现象更明显,在调用publishEvent后有更明显的停顿

@Component
public class MessageEventListener implements ApplicationListener<MessageEvent> {

    public void onApplicationEvent(MessageEvent messageEvent) {
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("i got messageEvent");
    }
}


实现异步的事件发送与监听

1.添加@Asycn注解

2.使用task标签使注解生效

3.配置executor


@Component
public class MessageEventListener implements ApplicationListener<MessageEvent> {

    @Async
    public void onApplicationEvent(MessageEvent messageEvent) {
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("i got messageEvent");
    }
}


xml

<task:annotation-driven/>
    <task:executor id="executor" keep-alive="1000" pool-size="20" queue-capacity="20" rejection-policy="ABORT"/>

<task:executor>配置参数:
id:当配置多个executor时,被@Async("id")指定使用;也被作为线程名的前缀。
pool-size:线程数数
queue-capacity:当最小的线程数已经被占用满后,新的任务会被放进queue里面,当这个 queue的capacity也被占满之后,pool里面会创建新线程处理这个任务,直到总线程数达到了max size,这时系统会拒绝这个任务并抛出TaskRejectedException异常(缺省配置的情况下,可以通过rejection-policy 来决定如何处理这种情况)
keep-alive:超过size的那些线程,任务完成后,再经过这个时长(秒)会被结束掉
rejection-policy:当pool已经达到size的时候,如何处理新任务
ABORT(缺省):抛出TaskRejectedException异常,然后不执行
DISCARD:不执行,也不抛出异常
DISCARD_OLDEST:丢弃queue中最旧的那个任务
CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值