springboot如何开启一个监听线程执行任务

 更新时间:2023年02月28日 14:34:54   作者:KillCom  
这篇文章主要介绍了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();
    }
}

以上就是三种创建的方式。

下面是代码的结构图:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot中配置Web静态资源路径的方法

    SpringBoot中配置Web静态资源路径的方法

    这篇文章主要介绍了SpringBoot中配置Web静态资源路径的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 解读@RabbitListener起作用的原理

    解读@RabbitListener起作用的原理

    这篇文章主要介绍了解读@RabbitListener起作用的原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • JSP页面无法识别EL表达式问题解决方案

    JSP页面无法识别EL表达式问题解决方案

    这篇文章主要介绍了JSP页面无法识别EL表达式问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • java equals和=,==的区别详细介绍

    java equals和=,==的区别详细介绍

    这篇文章主要介绍了java equals和=,==的区别,学习Java的朋友对equals 和== 这个概念开始使用的时候会有疑问,很难辨别如何正确使用,这里帮大家详细讲解该知识点,希望大家能掌握,有需要的小伙伴可以参考下
    2016-10-10
  • MyBatis流式查询的使用详解

    MyBatis流式查询的使用详解

    流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用
    2022-08-08
  • Scala常用List列表操作方法示例

    Scala常用List列表操作方法示例

    这篇文章主要介绍了Scala常用List列表操作方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • SpringBoot学习之基于注解的缓存

    SpringBoot学习之基于注解的缓存

    spring boot对缓存支持非常灵活,我们可以使用默认的EhCache,也可以整合第三方的框架,只需配置即可,下面这篇文章主要给大家介绍了关于SpringBoot学习之基于注解缓存的相关资料,需要的朋友可以参考下
    2022-03-03
  • Java实现图片合成的示例详解

    Java实现图片合成的示例详解

    前端有一个神器——canvas,这个画布标签可以处理各种图片的合成,可以精确到图片的具体坐标。java后端也有这样的神器,那就是image-combiner,可以很简单的合成图片,感兴趣的可以试一试
    2022-01-01
  • SpringCloud实现灰度发布的方法步骤

    SpringCloud实现灰度发布的方法步骤

    本文主要介绍了SpringCloud实现灰度发布的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Java中json处理工具JsonPath的使用教程

    Java中json处理工具JsonPath的使用教程

    JsonPath类似于XPath,是一种json数据结构节点定位和导航表达式语言,这篇文章主要为大家介绍了JsonPath的基本使用,需要的小伙伴可以参考下
    2023-08-08

最新评论