Spring Boot中使用SpringEvent组件

Spring的事件机制是基于观察者模式的实现,主要由以下三个部分组成:

事件(Event):事件是应用中发生的重要事情,通常是一个继承自ApplicationEvent的类。

事件发布器(Publisher):发布事件的对象,通常是Spring的应用上下文(ApplicationContext)。

事件监听器(Listener):监听并处理事件的对象,通常是实现了ApplicationListener接口的类。

  • 同步方法
  1. 创建自定义事件,自定义事件需要继承ApplicationEvent类,并添加相应的属性和构造方法
package com.ssdl.baize.pub;

import org.springframework.context.ApplicationEvent;

public class CustomEvent extends ApplicationEvent {
    private String message;

    public CustomEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
  1. 创建事件监听器,用于监听和处理自定义事件。事件监听器需要实现ApplicationListener接口,并覆盖onApplicationEvent方法。
package com.ssdl.baize.pub;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class CustomEventListener implements ApplicationListener<CustomEvent> {

    @Override
    public void onApplicationEvent(CustomEvent event) {
        try {
            Thread.sleep(5000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("休眠5秒");
        log.info("Received custom event - {}" , event.getMessage());
    }
}

3.发布事件,要在某个组件中注入ApplicationEventPublisher,并调用其publishEvent方法。

package com.ssdl.baize.pub;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;

@Component
public class CustomEventPublisher {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void publishEvent(String message) {
        CustomEvent customEvent = new CustomEvent(this, message);
        applicationEventPublisher.publishEvent(customEvent);
    }
}

4.测试

	@Autowired
    private CustomEventPublisher customEventPublisher;

    @GetMapping(path = "/pub")
    @ApiOperation(value = "发布订阅")
    public String pub(@RequestParam("message") String message) {
        log.info("start");
         customEventPublisher.publishEvent(message);
         log.info("发送完成!!!");
         return "OK";
    }

5.结果
在这里插入图片描述

  • 异步方法
    说明:创建自定义事件、发布事件、测试这三个如同步方法一样,只需要更改创建事件监听器即可
package com.ssdl.baize.pub;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

@Configuration
@EnableAsync
public class AsyncConfig {
}
package com.ssdl.baize.pub;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class AsyncCustomEventListener {

    @Async
    @EventListener(condition = "#event.message.startsWith('filter')")
    public void handleCustomEvent(CustomEvent event) {
        try {
            Thread.sleep(5000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("休眠5秒");
        log.info("Async received custom event - {}" , event.getMessage());
    }
}

注:condition 限制只接收filter开头的消息

结果:
在这里插入图片描述

相关推荐

  1. vue.js如何使用动态

    2024-07-11 17:40:04       51 阅读
  2. iview 页面判断溢出才使用Tooltip

    2024-07-11 17:40:04       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 17:40:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 17:40:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 17:40:04       58 阅读
  4. Python语言-面向对象

    2024-07-11 17:40:04       69 阅读

热门阅读

  1. springmvc前端jsp与html

    2024-07-11 17:40:04       20 阅读
  2. 前端不同年限的差异不同开发经验的差异

    2024-07-11 17:40:04       22 阅读
  3. 锂电池容量低,原因何在?

    2024-07-11 17:40:04       20 阅读
  4. IEC62056标准体系简介-5.低层通信协议

    2024-07-11 17:40:04       22 阅读
  5. (补充)IDEA项目结构

    2024-07-11 17:40:04       21 阅读
  6. nest通过装饰器获取jwt有效负载数据

    2024-07-11 17:40:04       25 阅读
  7. 物联网设计竞赛_10_Jetson Nano中文转汉语语音

    2024-07-11 17:40:04       20 阅读
  8. C++中的设计模式

    2024-07-11 17:40:04       23 阅读
  9. 软考中项报名需要什么条件?全方位分析!

    2024-07-11 17:40:04       19 阅读
  10. vscode编辑keil工程 5. vscode 提交git一直卡着转圈圈

    2024-07-11 17:40:04       20 阅读
  11. Vue3 根据相对路径加载vue组件

    2024-07-11 17:40:04       28 阅读
  12. ps导入图片的方式

    2024-07-11 17:40:04       22 阅读