SpringBoot中使用监听器

1.定义一个事件

复制代码
/**
 * 定义事件
 * @author hrui
 * @date 2024/7/25 12:46
 */
public class CustomEvent extends ApplicationEvent {
    private String message;

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

    public String getMessage() {
        return message;
    }
}

在监听器中可以通过 event.getSource(); 来获取事件源

2.通过ApplicationEventPublisher 发布事件

复制代码
@Service
public class EventPublisherService {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

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

3.通过监听器订阅事件

复制代码
/**
 * 监听事件,订阅事件
 * @author hrui
 * @date 2024/7/25 12:49
 */
@Component
public class CustomEventListener {


    @Async
    //@EventListener
    //@TransactionalEventListener 有事务的监听
    @EventListener(condition = "#event.message == 'hello'") //SPEL(Spring表达式)条件监听 对象也可以用== 判断
    //@EventListener(condition = "#event.message .equals('hello') ")
    //@EventListener(condition = "#event.message.endsWith("123") ") //很多方法可以选择
    public void handleCustomEvent(CustomEvent event) {
        System.out.println(Thread.currentThread().getName());
        System.out.println("Received event - " + event.getMessage());
    }
}

第三步简单实用了@EventListener注解 如果不用就需要这么做

去实现ApplicationListerner<处理的事件> 需不需要异步自己看着办

复制代码
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {

    @Override
    public void onApplicationEvent(CustomEvent event) {
        // 条件判断
        if ("hello".equals(event.getMessage())) {
            // 异步处理
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName());
                System.out.println("Received event - " + event.getMessage());
            }).start();
        }
    }
}

/**
 * @author hrui
 * @date 2024/7/25 12:51
 */
@RestController
public class ListenerController {

    @Autowired
    private EventPublisherService eventPublisherService;

    @GetMapping("/listener")
    public String listener(String message)
    {
        eventPublisherService.publishEvent(message);
        return "listener";
    }
}
相关推荐
程序员小凯13 小时前
Spring Boot测试框架详解
java·spring boot·后端
豐儀麟阁贵14 小时前
基本数据类型
java·算法
_extraordinary_14 小时前
Java SpringMVC(二) --- 响应,综合性练习
java·开发语言
你的人类朋友14 小时前
什么是断言?
前端·后端·安全
程序员 Harry14 小时前
深度解析:使用ZIP流式读取大型PPTX文件的最佳实践
java
程序员小凯15 小时前
Spring Boot缓存机制详解
spring boot·后端·缓存
wxweven15 小时前
校招面试官揭秘:我们到底在寻找什么样的技术人才?
java·面试·校招
i学长的猫15 小时前
Ruby on Rails 从0 开始入门到进阶到高级 - 10分钟速通版
后端·ruby on rails·ruby
陈陈爱java15 小时前
新知识点背诵
java
失散1316 小时前
分布式专题——39 RocketMQ客户端编程模型
java·分布式·架构·rocketmq