programing

스프링 부트 응용 프로그램에서 스레드 시작

showcode 2023. 4. 5. 22:28
반응형

스프링 부트 응용 프로그램에서 스레드 시작

spring boot 시작 후 Java 클래스(실행하고 싶은 Java 스레드 포함)를 실행하고 싶다.초기 코드:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

시작할 때 실행하는 코드는 다음과 같습니다.

public class SimularProfesor implements Runnable{

    // Class atributes

    // Constructor
    public SimularProfesor() {
        //Initialization of atributes
    }

    @Override
    public void run() {
        while(true) {
            // Do something
        }
    }
}

이 실을 뭐라고 부릅니까?내가 해야 할 일은 이거야

@SpringBootApplication
public class Application {
     public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        // Call thread (constructor must be executed too)
     }
}

스스로 실타래를 만지작거리지 마세요.Spring(및 일반 Java)은 이를 위한 멋진 추상화를 가지고 있다.

먼저 이런 종류의 콩을 만듭니다.TaskExecutor구성 중

@Bean
public TaskExecutor taskExecutor() {
    return new SimpleAsyncTaskExecutor(); // Or use another one of your liking
}

그 후,CommandLineRunner(단,ApplicationListener<ContextRefreshedEvent>작업 스케줄 설정에도 도움이 됩니다.

@Bean
public CommandLineRunner schedulingRunner(TaskExecutor executor) {
    return new CommandLineRunner() {
        public void run(String... args) throws Exception {
            executor.execute(new SimularProfesor());
        }
    }
}

물론 봄까지 여러분만의 수업을 만들 수도 있습니다.

이것의 장점은 봄은 여러분을 위해 실타래를 정리해주기 때문에 여러분은 그것에 대해 스스로 생각할 필요가 없다는 것입니다.사용하였습니다.CommandLineRunner모든 콩이 초기화된 후에 실행되기 때문입니다.

  • 메인 클래스 스프링 부트

    @SpringBootApplication
    @EnableAsync
    @Controller
    public class ...
    
    
  • 클래스 컨트롤러의 예

    import javax.annotation.PostConstruct;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.core.task.TaskExecutor;
    import org.springframework.stereotype.Component;
    
    @Component
    public class ExecutorBase {
    
        private static final Logger log = LoggerFactory.getLogger(ExecutorBase.class);
    
        @Autowired
        private TaskExecutor taskExecutor;
        @Autowired
        private ApplicationContext applicationContext;
    
        private Boolean debug = true;
    
        @PostConstruct
        public void atStartup() {
            ClasseTaskRunn classeTaskRunn = applicationContext.getBean(ClasseTaskRunn.class);
            taskExecutor.execute(classeTaskRunn );
            if (debug) {
                log.warn("###### Startup ok");
            }
        }
    }
    
    
  • 실행 가능한 클래스 태스크 예시

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Component;
    
    @Component
    @Scope("application")
    public class ClasseTaskRunn implements Runnable {
    
        private static final Logger log = LoggerFactory.getLogger(ClasseTaskRunn.class);
    
        @Autowired
        ClasseDAO classeDAO;
    
        @Override
        public void run() {
            longBackgorund();
        }
    
        protected void longBackgorund() {
            while (test) {
                if (debug) {
                    log.warn("###### DEBUG: " ... );
                }
    
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    

언급URL : https://stackoverflow.com/questions/37390718/start-thread-at-springboot-application

반응형