springboot如何开启一个监听线程执行任务
作者:KillCom 发布时间:2022-01-09 08:44:48
标签:springboot,监听,线程,执行任务
springboot开启一个监听线程执行任务
public class StartApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
ApplicationContext applicationContext = contextRefreshedEvent.getApplicationContext();
ApplicationContext parent = applicationContext.getParent();
if (parent == null) {
CacheManager cacheManager = applicationContext.getBean(CacheManager.class);
Cache cache = cacheManager.getCache(MsConstants.NODE_CACHE_NAME);
new Thread(new Runnable() {
@Override
public void run() {
//代码
}
}).start();
}
}
public static void main(String[] args) {
SpringApplication app = new SpringApplication(FigureServerApplication.class);
app.addListeners(new StartApplicationListener());
app.run(args);
}
springboot中监听事件的创建流程
事件监听有同步和异步两种方式,springboot项目中提供了一个用于异步处理的注解:@Async。
事件的大体步骤
1:定义一个事件。
2: 创建一个 * 。
3:确保 * 在容器内。
4:发布事件,进行测试。
废话不多说,简单叙述几个不同方式的demo。
首先,我们先创建一个springboot项目。
第一种
1:定义一个事件,需要继承ApplicationEvent
public class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {
super(source);
System.out.println("我是一个事件,目前在事件的构造器内");
}
}
2:创建一个 * 。直接实现ApplicationListener接口,重写其中onApplicationEvent方法.
public class MyEventListener implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent event) {
System.out.println("现在开始执行 * 中的内容,我是直接实现ApplicationListener接口的方式进行的");
System.out.println("event.getSource() = " + event.getSource());
}
}
3:将 * 手动添加进应用容器内,并进行发布事件。
@SpringBootApplication
public class EventTestApplication {
public static void main(String[] args) {
// SpringApplication.run(EventTestApplication.class, args);
//第一种:自己手动将 * 添加到application中
SpringApplication application = new SpringApplication(EventTestApplication.class);
//添加 *
application.addListeners(new MyEventListener());
ConfigurableApplicationContext context = application.run(args);
//进行发布事件
context.publishEvent(new MyEvent("Event数据源"));
context.close();
}
}
4:启动主启动类,进行打印测试。
第二种
1:同第一种的1
2:创建一个 * 。
/**
*第二种:打上Compoent注解, 将事件 * 自动加入到应用容器中
* 这种方式不需要手动加入到容器中。
* */
@Component
public class MyEventListener2 implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent event) {
System.out.println("现在开始执行 * 中的内容,我是打Compoent注解的方式进行的");
System.out.println("event.getSource() = " + event.getSource());
}
}
3:发布事件,后续进行启动类测试即可。
@SpringBootApplication
public class EventTestApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(EventTestApplication.class, args);
//发布事件
context.publishEvent(new MyEvent("source"));
context.close();
}
}
第三种
全部采用注解的方式
1:同第一种的1
2:创建一个 * 。
/**
*第三种:采用@EventListener注解的方式,不需要在类上实现ApplicationListener接口。
* 直接采用的是通过注解,将方法标识为一个 * 。
* */
@Component
public class MyEventListener3 {
@Async//异步注解。开启一个新线程。 去掉此注解则会变成同步监听。
@EventListener(classes = MyEvent.class)
public void TestListener(MyEvent myEvent){
System.out.println("我是@EventListener注解的方式实现的 * ");
System.out.println("myEvent.getSource() = " + myEvent.getSource());
}
}
3:发布事件,后续进行启动类测试即可。
@SpringBootApplication
public class EventTestApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(EventTestApplication.class, args);
//发布事件
context.publishEvent(new MyEvent("source"));
context.close();
}
}
来源:https://blog.csdn.net/samHuangLiang/article/details/80268530


猜你喜欢
- 后台控制层: public static final String HEAD_IMG_DIR = "D:/upload/&quo
- 场景需要判断,首字母是否是英文字母。有人说,那还不简单么,StringUtils.isAlpha() 就可以搞定。 笔者也是这么想的,结果却
- package com.test; import java.io.FileNotFoundException;&nbs
- 某天一朋友突然发来一个地址,问我怎么获取这张图片的后缀名??将代码放在下面以供参考:using System;using System.Dr
- 增加了用于处理MyBatis的两个bean:SqlSessionFactoryBean、MapperFactoryBean1、注册SqlSe
- 本文实例讲述了java实现List中对象排序的方法。分享给大家供大家参考,具体如下:package com.test; import jav
- 1.生成自己的注解(为了确定在哪些位置使用)/** * 关闭patch delete的model处理,否则会报错 */@Target({El
- 一个activity就好比一个网页,此文章讲解怎样创建一个activity并且实现跳转!一、学习创建Activity1、新建一个java类,
- 本文主要介绍了C# 泛型List排序的实现,分享给大家,具体如下:代码using System;using System.Collectio
- AbstractDetectingUrlHandlerMapping是通过扫描方式注册Handler,收到请求时由Abstrac
- vue3新增effectScope相关的API其官方的描述是创建一个 effect 作用域,可以捕获其中所创建的响应式副作用 (即计算属性和
- 延迟队列的使用场景还比较多,例如:1、超时未收到支付回调,主动查询支付状态;2、规定时间内,订单未支付,自动取消;。。。总之,但凡需要在未来
- 数据库中记录了商家在百度标注的经纬度(如:116.412007, 39.947545)最初想法,以圆心点为中心点,对半径做循环,半径每增加一
- 一、三方库介绍地址:https://github.com/youth5201314/banner介绍:从学习 Android 开始到现在工作
- 本文以实例形式讲述了C#命令模式的实现方法,分享给大家供大家参考。具体实现方法如下:现假设想让遥控器控制电灯的开关、电视机的开关和切换,该如
- 11.可以使用抽象函数重写基类中的虚函数吗? 答: 可以 需使用 new 修饰符显式声明,表示隐藏了基类中该函数的实现
- 本文讨论了Spring Data JDBC如何实现DDD中聚合根存储的设计思路,其中主要讨论了是不是每个实体都需要一个对应数据表,这种问题需
- springboot+mybatis+前端vue,使用前后端分离架构实现的个人博客系统,共7个模块,首页,写博客,博客详情页,评论管理,文章
- 本文实例为大家分享了Android studio实现PopupWindow弹出框的具体代码,供大家参考,具体内容如下实现步骤:第一步:自定义
- 写在前面,首先,我用的java转json序列化的工具是java开源的jackson。今天在做后端接口的时候,发现获取的json对象中少了几个