2016-08-02 33 views
1

我有一个过程,是一个无限循环:如何在Spring Boot中管理无限过程?

public class MyProcess { 

    public void start() { 
     while (true) { 
      //process 
     } 
    } 
} 

当我开始使用Spring的引导,我的第一个方法是让从上下文的bean的应用程序已经开始后,手动启动过程:

@SpringBootApplication 
public class MyApplication { 

    public static void main(String[] args) { 
     ApplicationContext applicationContext = SpringApplication.run(MyApplication.class, args); 

     MyProcess myProcess = applicationContext.getBean(MyProcess.class); 
     myProcess.start(); 
    } 
} 

这工作,但似乎并不喜欢做的正确的方式,让我实现了一个CommandLineRunner

@Component 
public class MyRunner implements CommandLineRunner { 

    @Autowired 
    private MyProcess myProcess; 

    @Override 
    public void run(String... args) { 
     this.myProcess.start(); 
    } 
} 

这跟以前几乎一样,但这里的SpringApplication#run调用从未实际完成,这似乎也是错误的。 我想对不对?

然后我试着用Executor我自己管理这个,但为了捕捉任何Exception我不得不打电话Future#get导致在相同的阻断状态。

取而代之,我现在在CommandLineRunner#run方法上使用@Async注释。

这似乎是最好的解决方案,因为应用程序在任务启动后完成启动。任何Exception将被选中并记录下来,但由Sprint创建的支持Executor会阻止应用程序关闭。

我假设有一种方法要求Spring终止Executor,这样整个应用程序就可以退出了,因为我使用Supervisor在外部管理它。

这是正确的方法还是我错过了一个步骤?应用程序是否应该独立并在发生故障后重新启动进程?

回答

0

在主线程中做一些工作。从main()拨打myProcess.start()而没有@Async有什么问题?当你完成你的工作只是离开循环MyProcess#start

+0

这是我做的第一,但我从来没有见过,在任何例子,所以我不知道。那么CommandLineRunner的目的是什么? – Djon

+0

@Djon我有同样的问题。看起来这是一种在运行环境中使用注入bean访问命令行参数的方式(在应用程序启动后)。我使用命令行应用程序的CommandLineRunner接口 – ruX

相关问题