Spring Boot中自定义事件监听

时间:2022-10-12 09:43:29 类型:JAVA
字号:    

在实际项目中,我们往往需要自定义一些事件和监听器来满足业务场景,比如在微服务中会有这样的场景:

服务 A 在处理完某个逻辑之后,需要通知微服务 B 去处理另一个逻辑,或者微服务 A 处理完某个逻辑之后,需要将数据同步到微服务 B,这种场景非常普遍,这个时候,我们可以自定义事件以及监听器来监听,一旦监听到微服务 A 中的某事件发生,就去通知微服务 B 处理对应的逻辑。

步骤1, 自定义事件A

public class MyEvent extends ApplicationEvent {
    private User user;
    public MyEvent(Object source, User user) {
        super(source);
        //这里写服务A的内容,如下
        this.user = user;
        ystem.out.println("A服务完成");
    }

    public User getUser() {
        return user;
    }
}

步骤2, 监听事件A,在监听事件中 实现B或者B

@Component
public class MyEventListener implements ApplicationListener<MyEvent> {
    public void onApplicationEvent(MyEvent myEvent) {
        User user = myEvent.getUser();
        // 一旦MyEvent事件发生,这里就会执行
        // 处理事件,实际项目中可以通知别的微服务或者处理其他逻辑等等
        System.out.println("用户名:" + user.getUsername());
        System.out.println("密码:" + user.getUserpwd());
        System.out.println("监听事件发生后, 通知的服务已经完成");
    }
}

步骤3,发布事件

@Service
public class UserService {
@Resource
private ApplicationContext applicationContext;
    /**
    * 发布事件
    * @return
    */
    public User getUser2() {
        User user = new User(1L, "庄子", "123456");
        //发布事件
        MyEvent event = new MyEvent(this, user);
        applicationContext.publishEvent(event);
        return user;
    }
}

在 service 中注入 ApplicationContext,在业务代码处理完之后,通过 ApplicationContext 对象手动发布 MyEvent 事件,这样我们自定义的监听器就能监听到,然后处理监听器中写好的业务逻辑

最后,在 Controller 中写一个接口来测试一下

@Resource
private UserService userService;
@GetMapping("/publish")
public String eventPublish() {
    userService.getUser2();
    return "success";
}

执行流程:调用服务,发布事件,事件发布后,会被监听到

浏览器访问 http://localhost:8001/listener/publish

1.jpg

<