Spring(7)spring消息监听机制

1,352 阅读2分钟

目录

消息事件是spring重要的功能,主要的作用是,一个地方发出通知,其他地方那个能够进行相应代码的执行。

1.相关的概念:

(一)消息:在spring中用来完成信息传递的载体,任何实现了ApplicationEvent接口的类都可以作为消息

(二)消息的发布者:spring的事件发布者将我们的消息发布,调用AppliacionPublisher的publishEvent方法将消息发布

(三)消息的监听者:spring消息的接受者,接收到消息后完成相关的操作

2.实际应用

消息:

//实现了ApplicationEvent方法,重写其构造函数
public class MyEvent1 extends ApplicationEvent {
    private String message;

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

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

发布者:

//调用applicationEventPublisher中的publisher方法,将消息发布
class PublishEvent {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void getEvent() {
        System.out.println("----发布1开始-------");
        MyEvent1 event = new MyEvent1(this, "新消息1");
        applicationEventPublisher.publishEvent(event);//发布者发布消息
        System.out.println("----发布1完成-------");
    }
}

监听者:

//实现了ApplicationListener接口,实现onApplicationEvent方法,并注册至spring容器
@Component
public class Listener1 implements ApplicationListener<MyEvent1> {

    @Override
    public void onApplicationEvent(MyEvent1 event) {
        System.out.println("Listener1 收到事件通知:" + event.getMessage());
        //do something
    }
}

3.使用@EventListener注解

在监听者的方法上使用@EventListener注解,相当于该方法实现了ApplicationListener接口,并且一个监听者可以拥有多个@EventListener,完成对多个消息的监听

/**
 * 学生监听多种事件,并作出响应
 */
@Component
public class Student {

	/**
	 * 监听上课铃声
	 * @param event1
	 */
	@EventListener
	public void listenSchoolBell(MyEvent1 event1) {
		System.out.println("上课铃响了,我要去上课...");
		//do something
	}
	
	/**
	 * 监听老师提问
	 * @param event2
	 */
	@EventListener
	public void listenTeacherAskMe(MyEvent1 event2) {
		System.out.println("老师提问了,我要起立回答问题...");
		//do something
	}
}

4.异步监听

在spring中消息的监听默认是按照循环方式执行的,如果一个消息监听者出现异常,则后续的消息发布会阻塞,因此我们可以利用异步消息监听,每个监听者接收到消息之后,会创造一个新的线程来处理该消息事件,这样可以避免消息监听者异常带来的阻塞问题

使用方法: (一)在配置类上使用@EnableAsync注解,表明该项目中开启异步方法

(二)在监听者需要采用异步监听的方法上采用@Async注解

//开启异步处理方式
@EnableAsync
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {
		public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

@Component
public class Listener4 {

//在监听方法上使用@Async注解
	@Async
	@EventListener
	public void listenerMyEvent1(MyEvent1 event) {
		System.out.println("Listener4 收到事件通知:" + event.getMessage());
	
	}
}

5.源码分析

(一)spring事件机制流程

未完待续。。。