ApplicationEventPublisher的简单使用

ApplicationEventPublisher 是 Spring 框架中的一个接口,用于发布应用程序事件。它定义了一个名为 publishEvent 的方法,用于发布事件。

在程序内部一些简单的通信场景,可以优先选择ApplicationEventPublisher来处理,或者项目没有配备MQ中间件的场景……泰裤辣!

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ApplicationEventPublisher;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

// 事件
class MyEvent extends ApplicationEvent {
    private String message;

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

    public String getMessage() {
        return message;
    }
}

// 事件监听者
@Component
class MyEventListener implements ApplicationListener<MyEvent> {

    @Override
    public void onApplicationEvent(MyEvent event) {
        System.out.println("接收到消息:" + event.getMessage());
    }
}

// 事件发布者
@Component
class EventPublisher {
    private final ApplicationEventPublisher eventPublisher;

    public EventPublisher(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    public void publishEvent(String message) {
        eventPublisher.publishEvent(new MyEvent(this, message));
    }
}

// 应用程序入口类
@Component
public class Application {

    private final EventPublisher eventPublisher;

    public Application(EventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    public void run() {
        eventPublisher.publishEvent("Hello, World!");
    }

    public static void main(String[] args) {
        org.springframework.context.ApplicationContext context =
                org.springframework.boot.SpringApplication.run(Application.class, args);
        Application application = context.getBean(Application.class);
        application.run();
    }
}

MyEvent这个实现类,即可视为消息的一种映射,如果你发布不同类型的消息,那么可以对MyEvent的成员变量做相应扩展,并于监听者MyEventListener处根据不同类型消息做不同行为的处理。

缺点(因此在使用的时候,要根据你的实际业务场景来选择用它,还是用MQ中间件)

  1. 有限的可靠性:ApplicationEventPublisher 是在应用程序内部实现的,因此它依赖于应用程序的运行状态。如果应用程序崩溃或重启,那些未被处理的事件可能会丢失。与消息队列相比,消息队列通常具有持久化和可靠性保证,可以在应用程序故障后保留未处理的消息。

  2. 性能开销:尽管 ApplicationEventPublisher 是应用程序内部的实现,但它仍然需要遍历所有的事件监听器并调用它们的处理方法。如果事件监听器过多或处理逻辑复杂,可能会导致性能开销。

  3. 难以追踪和调试:由于事件的传播过程是通过接口和抽象类型进行定义的,它们的调用和处理过程可能比较难以跟踪和调试。相比之下,使用消息队列可以更容易地追踪和监控消息的传递和处理过程。

posted @ 2023-08-17 17:38  Ashe|||^_^  阅读(1013)  评论(0编辑  收藏  举报