2017-02-13 16 views
0

В моем приложении загрузки Spring я пытаюсь выполнить некоторые задачи в фоновом режиме.Java Spring Boot - CommandLineRunner для операций Async db, которые выполняются в фоновом режиме

Получение данных из одного разряда и сохранение их в другом, каждые 30 минут.

Правильно ли сделать класс CommandLineRunner, который позаботится об этом с помощью @Async?

@Component 
public class UpdateDB implements CommandLineRunner { 

@Autowired 
private WagerBoardMarksRepo loadRepo; 

@Autowired 
private StoreDbEntRepo storeRepo; 

@Async 
private static void update() { 
    while (true) { 

     // get data from loadRepo. 
     // save data to storeRepo 

     try { 
      Thread.sleep("sleep for 30min"); // 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void run(String... args) throws Exception { 
    update(); 
} 

}

+0

Это не сработает, потому что это первый вызов внутреннего метода (не работает из-за прокси для AOP). Во-вторых, вы не можете применять методы '@ Async' к' static'. Так что это просто не сработает. '@ Scheduled' придумана для этого, не пытайтесь создать свою собственную снова. Если у вас есть большой объем данных, вы можете захотеть объединить это с Spring Batch. –

ответ

0

Вы могли бы извлечь выгоду от введения Spring batch для вашего приложения. В настоящее время у вас нет большого контроля над тем, что происходит в вашей партии, например, что происходит при неудачном выполнении задания или о том, сколько элементов нужно обрабатывать одновременно, или должно выполняться в многопоточной среде.

С Spring Batch вы можете создать ItemReader, который считывает из WagerBoardMarksRepo, ItemProcessor, который преобразует объект в свой выходной и ItemWriter, который хранит элементы в StoreDbEntRepo. Объяснение этого было бы слишком широким, но вы можете прочитать их reference guide, чтобы начать.

Чтобы запланировать задачи каждые 30 минут, вы можете использовать @Scheduled annotation. Просто настройте fixedDelay и запустите его. В качестве альтернативы вы также можете указать задержку с использованием синтаксиса cron.

Пример:

@Scheduled(fixedDelay = 1800000) // 1000 millis * 1800 seconds = 30 minutes 
public void doBatch() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException { 
    jobLauncher.run(batchJob, new JobParametersBuilder().toJobParameters()); 
} 
1

планировщик сделан для такой операции, см код ниже

@Component 
public class ScheduledTasks { 
    @Scheduled(cron = "0 0,30 * * * * ?") 
    public void update() { 
     // get data from loadRepo. 
     // save data to storeRepo 
    } 
} 

И не забывайте использовать @EnableScheduling в классе Startup

@SpringBootApplication 
@EnableScheduling 
public class Application { 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class); 
    } 
} 

См Scheduling Tasks Документы весны для более подробной информации.