Spring的事件和监听器

网友投稿 504 2022-11-11

Spring的事件和-

Spring的事件和-

目录Spring的事件和--同步与异步1、首先新建StartWorkflowEvent.java,2、新建一个-StartWorkflowListener.java3、创建一个事件发布类EventPublisher.java4、相关的配置Spring事件、异步监听这可以对系统进行解耦

Spring的事件和--同步与异步

Application下抽象子类ApplicationContextEvent的下面有4个已经实现好的事件

ContextClosedEvent(容器关闭时)

ContextRefreshedEvent(容器刷新是)

ContextStartedEvent(容器启动时候)

ContextStoppedEvent(容器停止的时候)

同样,这四个事件都继承了ApplicationEvent,如果我们想自定义事件,也可以通过继承ApplicationEvent来实现

1、首先新建StartWorkflowEvent.java,

继承ApplicationEvent抽象类

public class StartWorkflowEvent extends ApplicationEvent {

//存放构造器送入的值

private String msg;

//构造器参数可以随意设置,这里为了方便调试,设置为字符串

public StartWorkflowEvent (String msg) {

super(msg);

this.msg=msg;

}

//自定义一个方法,这个方法也可以随意写,这里也是测试用

public void myevent(){

System.out.println("********My event**************");

System.out.println(msg);

System.out.println("*******************************");

}

}

2、新建一个-StartWorkflowListener.java

实现ApplicationListener

/**

* 发起流程事件监听

*/

@Component("startWorkflowListener")

public class StartWorkflowListener implements ApplicationLhttp://istener {

@Autowired

private OaWorkflowHepler oaWorkflowHepler;

//@Async注解异步调用时使用, 异步调用时, 需要在xml配置文件中添加

// @Async

@Override

public void onApplicationEvent(StartWorkflowEvent event) {

oaWorkflowHepler.start(event.getMsg());

}

}

3、创建一个事件发布类EventPublisher.java

/**

* 发布事件

*/

@Component("eventPublisher")

public class EventPublisher {

@Autowired

private ApplicationContext applicationContext;

/**

* 发布事件

* @param event

*/

public void publishEvent(ApplicationEvent event) {

applicationContext.publishEvent(event);

}

}

4、相关的配置

配置:

executor:指定一个缺省的executor给@Async使用。

例子:

配置参数:

id:当配置多个executor时,被@Async("idsBbuc")指定使用;也被作为线程名的前缀。

core size:最小的线程数,缺省:1

max size:最大的线程数,缺省:Integer.MAX_VALUE

queue-capacity:当最小的线程数已经被占用满后,新的任务会被放进queue里面,当这个 queue的capacity也被占满之后,pool里面会创建新线程处理这个任务,直到总线程数达到了max size,这时系统会拒绝这个任务并抛出TaskRejectedException异常(缺省配置的情况下,可以通过rejection-policy 来决定如何处理这种情况)。缺省值为:Integer.MAX_VALUE

keep-alive:超过core size的那些线程,任务完成后,再经过这个时长(秒)会被结束掉

rejection-policy:当pool已经达到max size的时候,如何处理新任务

ABORT(缺省):抛出TaskRejectedException异常,然后不执行

DISCARD:不执行,也不抛出异常

DISCARD_OLDEST:丢弃queue中最旧的那个任务

CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行

Spring事件、异步监听

使用事件的模式可以对系统进行解耦,事件源发布一个事件,

事件-可以消费这个事件,而事件源不用关注发布的事件有哪些-,

这可以对系统进行解耦

public class Mains extends ApplicationEvent {

public Mains(Object name) {

super(name);

System.out.println(String.format("Hi,我是被监听的%s!",name));

}

}

@Component

public class ListenerMains {

//@Async // 开启异步就无法使用@Order(0)进行排序了

@Order(0)

@EventListener(Mains.class)

public void listener(Mains mains){

System.out.println("这是第一个监听类 "+mains.getSource());

}

//@Async

@Order(1)

@EventListener(Mains.class)

public void listener2(Mains mains){

System.out.println("这是第二个监听类 "+mains.getSource());

}

//@Async

@Order(2)

@EventListener(Mains.class)

public void listener3(Mains mains){

System.out.println("这是第三个监听类 "+mains.getSource());

}

}

public class TestController {

@Autowired

GetAccessToken getAccessToken;

@Autowired

ApplicationEventPublisher publisher;

@RequestMapping("test")

public Object get() {

publisher.publishEvent(new Mains("哈哈哈哈"));

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:DataFrame(3):DataFrame常用属性说明
下一篇:数据库设计三范式(重点内容)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~