react 前端框架如何驱动企业数字化转型与创新发展
504
2022-11-11
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~