原创

spring事件框架ApplicationEventPublisher入门

1、事件机制的场景

一个简单的场景,就是用户注册成功后,发短信通知和发邮件通知,其实这样的场景就是两种处理情况

注册成功后起一个线程执行发短信和发邮件通知
发送用户ID到mq,然后mq去执行
正规的话这种耗时的操作应该是使用MQ,但是使用MQ其实无形之间就增加了系统的复杂性,那么此时可以使用ApplicationEventPublisher代替MQ

2、事件发布者

public interface SmsSend {
    void sendCode(String tel, String code);
}


@Component
public class SmsSendImpl implements SmsSend {
    @Autowired private ApplicationEventPublisher applicationEventPublisher;

    @Override
    public void sendCode(String tel, String code) {
        CodeDTO codeDTO = new CodeDTO();
        codeDTO.setTel(tel);
        codeDTO.setCode(code);
        System.out.println("11111");
        applicationEventPublisher.publishEvent(codeDTO);
    }
}
  • 核心是通过ApplicationEventPublisher进行事件的发布

3、事件订阅者

@Component
public class SmsEventHandler {
    @Async
    @EventListener
    public void handle(CodeDTO codeDTO) {
        try {
            System.out.println("mmmmm");
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    @Async
    @EventListener
    public void handNone(CodeDTO code) {
        System.out.println("mmmm");
    }
}
  • 用EventListener来标识订阅者。根据形参来匹配事件。
  • @Async可以开启,需要开启@EnableAsync来支持

4、demo测试

@SpringBootTest
public class EventHandleTest {
    @Autowired private SmsSend smsSend;

    @Test
    public void test() {
        smsSend.sendCode("111", "22");
    }
}

控制台输出
11111
mmmmm
mmmm
正文到此结束
本文目录