spring boot ApplicationRunner使用


spring boot ApplicationRunner使用

它的使用比較簡單,實現ApplicationRunner的run方法

package com.hikvision.pbg.jc.confuciussecurity.modules.task;

import com.hikvision.pbg.jc.confuciussecurity.modules.constant.Constant;
import com.hikvision.pbg.jc.confuciussecurity.modules.util.kafka.KafkaProducerPool;
import com.hikvision.pbg.jc.confuciussecurity.modules.util.kafka.StringUtil;
import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(1)
public class KafkaFaceProducerTest implements ApplicationRunner {
    private static Logger logger = LoggerFactory.getLogger(KafkaFaceProducerTest.class);
    Producer<String, String> producer = KafkaProducerPool.getInstance(Constant.KAFKA_ADDR);
    public KafkaFaceProducerTest(){

    }
    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {

        while(true){
            Thread.sleep(1000);
            logger.info("kafka produce message");
            try {
                String str =String.valueOf(System.currentTimeMillis());
                producer.send(new KeyedMessage<String, String>("JSON_TOPIC", StringUtil.getUUID(), str));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //Thread.sleep(5000);
        //Producer<String, String> producer = KafkaProducerPool.getInstance(Constant.KAFKA_ADDR);


    }
}

它什么時候使用

一般我們spring boot 啟動類這么寫

    public static void main(String[] args) {
        System.out.println("begin1");
        SpringApplication.run(XX.class, args);
        System.out.println("begin2");
    }

ApplicationRunner的使用就在SpringApplication.run,里面有一段這樣的代碼實現就是:先把ApplicationRunner list執行完,再接着執行SpringApplication.run方法。
如果想通過先把ApplicationRunner起一個task,如果死循環,就很危險!因為main方法也進入到了死循環的階段

    private void callRunners(ApplicationContext context, ApplicationArguments args) {
        List<Object> runners = new ArrayList();
        runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
        runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
        AnnotationAwareOrderComparator.sort(runners);
        Iterator var4 = (new LinkedHashSet(runners)).iterator();

        while(var4.hasNext()) {
            Object runner = var4.next();
            if (runner instanceof ApplicationRunner) {
                this.callRunner((ApplicationRunner)runner, args);
            }

            if (runner instanceof CommandLineRunner) {
                this.callRunner((CommandLineRunner)runner, args);
            }
        }

    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM