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

目录
  • springboot开启一个监听线程执行任务
  • 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();
    }
}

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

下面是代码的结构图:

总结

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

(0)

相关推荐

  • SpringBoot父子线程数据传递的五种方案介绍

    目录 方案1.ThreadLocal+TaskDecorator 方案2.RequestContextHolder+TaskDecorator 方案3.MDC+TaskDecorator 方案4.InheritableThreadLocal 方案5.TransmittableThreadLocal 方案对比 简答说一下InheritableThreadLocal 总结 方案1.ThreadLocal+TaskDecorator 用户工具类 UserUtils /** *使用ThreadLocal

  • SpringBoot 项目中创建线程池

     前言: 前两天做项目的时候,想提高一下插入表的性能优化,因为是两张表,先插旧的表,紧接着插新的表,一万多条数据就有点慢了 后面就想到了线程池ThreadPoolExecutor,而用的是Spring Boot项目,可以用Spring提供的对ThreadPoolExecutor封装的线程池ThreadPoolTaskExecutor,直接使用注解启用 使用步骤: 先创建一个线程池的配置,让Spring Boot加载,用来定义如何创建一个ThreadPoolTaskExecutor,要使用@Con

  • 详解在SpringBoot如何优雅的使用多线程

    目录 快速使用 获取异步方法返回值 注意事项 本文带你快速了解@Async注解的用法,包括异步方法无返回值.有返回值,最后总结了@Async注解失效的几个坑. 在 SpringBoot 应用中,经常会遇到在一个接口中,同时做事情1,事情2,事情3,如果同步执行的话,则本次接口时间取决于事情1 2 3执行时间之和:如果三件事同时执行,则本次接口时间取决于事情1 2 3执行时间最长的那个,合理使用多线程,可以大大缩短接口时间.那么在 SpringBoot 应用中如何优雅的使用多线程呢? Don't

  • Springboot 配置线程池创建线程及配置 @Async 异步操作线程池详解

    目录 前言 一.创建一个Springboot Web项目 二.新建ThreadPoolConfig 三.新建controller测试 四.演示结果 前言 众所周知,创建显示线程和直接使用未配置的线程池创建线程,都会被阿里的大佬给diss,所以我们要规范的创建线程. 至于 @Async 异步任务的用处是不想等待方法执行完就返回结果,提高软件前台响应速度,一个程序中会用到很多异步方法,所以需要使用线程池管理,防止影响性能. 一.创建一个Springboot Web项目 需要一个Springboot项

  • SpringBoot用多线程批量导入数据库实现方法

    目录 环境 原始的for循环入库 批量保存操作 在批量插入的基础上使用多线程 处理多线程入库的事务问题 环境 springboot.mybatisPlus.mysql8 mysql8(部署在1核2G的服务器上,很卡,所以下面的数据条数用5000,太大怕不是要等到花儿都谢了 0.0) 原始的for循环入库 @Service @Slf4j public class MoreTestServiceImpl extends ServiceImpl<MoreTestMapper, MoreTestEnti

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

    目录 springboot开启一个监听线程执行任务 springboot中监听事件的创建流程 事件的大体步骤 第一种 第二种 第三种 总结 springboot开启一个监听线程执行任务 public class StartApplicationListener implements ApplicationListener<ContextRefreshedEvent> { @Override public void onApplicationEvent(ContextRefreshedEvent

  • 详解SpringBoot 发布ApplicationEventPublisher和监听ApplicationEvent事件

    资料地址 Spring @Aync 实现方法 自定义需要发布的事件类,需要继承ApplicationEvent类或PayloadApplicationEvent<T>(该类也仅仅是对ApplicationEvent的一层封装) 使用@EventListener来监听事件 使用ApplicationEventPublisher来发布自定义事件(@Autowired注入即可) /** * 自定义保存事件 * @author peter * 2019/1/27 14:59 */ public cla

  • SpringBoot事件发布和监听详解

    目录 概述 事件监听的结构 Publisher,Event和Listener的关系 事件 发布者 监听者 总结 概述 ApplicationEvent以及Listener是Spring为我们提供的一个事件监听.订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性.事件发布者并不需要考虑谁去监听,监听具体的实现内容是什么,发布者的工作只是为了发布事件而已.事件监听的作用与消息队列有一点类似. 事件监听的结构 主要有三个部分组成: 发布者Publ

  • springboot+redis过期事件监听实现过程解析

    1 修改 redis.conf配置文件: K Keyspace events, published with keyspace@ prefix事件 E Keyevent events, published with keyevent@ prefix g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, - $ String commands l List commands s Set commands h Hash co

  • Springboot启用多个监听端口代码实例

    前段时间服务有这么个需求,web端的接口需要有web安全相关的整改,但是对内的接口并不需要.所以服务需要多个端口启动,在此记录下 代码如下 @Configuration public class EmbeddedTomcatConfiguration { @Value("${server.additionalPorts}") private String additionalPorts; @Bean public EmbeddedServletContainerFactory serv

  • Mysql数据库监听binlog的开启步骤

    前言 我们经常需要根据用户对自己数据的一些操作来做一些事情. 比如如果用户删除了自己的账号,我们就给他发短信骂他,去发短信求他回来. 类似于这种功能,当然可以在业务逻辑层实现,在收到用户的删除请求之后执行这一操作,但是数据库的binlog为我们提供了另外一种操作方法. 要监听binlog,需要两步,第一步当然是你的mysql需要开启这一个功能,第二个是要写程序来对日志进行读取. mysql开启binlog. 首先mysql的binlog日常是不打开的,因此我们需要: 找到mysql的配置文件my

  • Java线程监听,意外退出线程后自动重启的实现方法

    Java线程监听,意外退出线程后自动重启 前一天写了一个微博爬行程序,主要工作原理就是每隔2分钟爬行一次微博,获取某N个关注朋友微博数量,然后将其保存起来,2分钟之后再次爬行,再取 其微博数量,与2分钟前保存的微博数量比较,如果数量增加,说明该好友在此2分钟之内发布微博,如果数量减少,则是删除微博.最后将爬行结果发送到指定手机上,作为通知! 今天看微博时发现自己关注的朋友发布了微博,然而自己手机却没有收到报警消息,查看爬行日志发现,在凌晨6点钟时,公司网络曾经断网,导致网络堵 塞,程序在爬行的时

  • Python写一个基于MD5的文件监听程序

    前述 写了一个基于MD5算法的文件监听程序,通过不同的文件能够生成不同的哈希函数,来实现实现判断文件夹中的文件的增加.修改.删除和过滤含有特定字符的文件名的文件. 需求说明 需要实现对一个文件夹下的文件的增加.修改和删除的监控, 一旦发生上述操作,则进行提示.可以选择过滤掉文件名中的特定字符和只监听文件名中含有特定字符的文件. 简述 首先,关于文件的增加.修改.删除的反馈,可以想到利用MD5等类似的加密算法,因为文件本身可以生成哈希值,只要文件内容或者文件名被修改过,就会生成和修改之前的哈希值不

  • 监听mysql表内容变化 mysql开启binlog

    前言 binlog 就是binary log,二进制日志文件,这个文件记录了mysql所有的增.删.改语句.通过binlog日志我们可以做数据恢复,做主从复制等等.可以看到,只要有了这个binlog,我们就拥有了mysql的完整备份了. 我们时常会碰到这样的需求,就是要监听某个表的变化,然后来做一些操作. 如果该表数据只增加.不删除修改的话,要监听比较简单,可以定时去查询最新的id即可.但要有删除.修改操作的话,免不了就得全表扫描,效率极低.倘若该表发生变化时,能触发个事件之类的可供监听,那最好

  • JavaScript监听一个DOM元素大小变化

    1.需求场景 开发过程中经常遇到的一个问题就是如何监听一个 div 的size变化. 比如我用canvas绘制了一个chart,当canvas的size发生变化的时候,需要重新绘制里面的内容,这个时候就需要监听resize事件做处理.window上虽然有resize事件监听,但这并不能满足我们的需求,因为很多时候,div的size发生了变化,实际 window.resize 事件并未触发. 对于div的resize事件的监听,实现方式有很多,比如定时器检查,通过scroll事件等等,本文主要介绍

随机推荐