Spring项目启动后台线程之CommandLineRunner
和 ApplicationRunner
接口
这两个接口类似于开机自启动,适合后台线程,比如后台同步数据
博主项目用到的是将聊天数据写入Es,数据量还好,但是要一直写入。
@Component
@Slf4j
public class EsWtrite implements CommandLineRunner {
private static ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue();
public void offerData(Object object) {
queue.offer(object);
}
static class Worker implements Runnable{
@Override
public void run() {
if(!queue.isEmpty()) {
doSomething();
}
}
}
@Override
public void run(String... args) throws Exception {
log.info("------------写入es线程启动-----------");
Thread thread = new Thread(new Worker());
thread.setName("session-event-sync-es-worker");
thread.setDaemon(true); //和项目共存亡,守护线程
thread.start();
}
}
ApplicationRunner和 CommandLineRunner 是一致的
就是ApplicationRunner
接收的参数不一样
package com.zhihao.miao;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Component
public class MyApplicationRunner implements ApplicationRunner{
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("===MyApplicationRunner==="+ Arrays.asList(args.getSourceArgs()));
System.out.println("===getOptionNames========"+args.getOptionNames());
System.out.println("===getOptionValues======="+args.getOptionValues("foo"));
System.out.println("==getOptionValues========"+args.getOptionValues("developer.name"));
}
}