本地代碼啟動不報錯,部署到服務器之后出現如下一個錯誤。
系統的日志如下:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. [o.s.b.a.l.ConditionEvaluationReportLoggingListener] 2019-08-15 15:57:51.789 [restartedMain] ERROR Application run failed [org.springframework.boot.SpringApplication] java.lang.IllegalStateException: Failed to execute CommandLineRunner at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:816) at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:797) at org.springframework.boot.SpringApplication.run(SpringApplication.java:324) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) at com.hvisen.springboot.ApplicationLauncher.main(ApplicationLauncher.java:21) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) Caused by: java.lang.IllegalStateException: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@65f0c43a has been closed already at org.springframework.context.support.AbstractApplicationContext.assertBeanFactoryActive(AbstractApplicationContext.java:1067) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1082) at com.hvisen.springboot.utils.SpringUtils.getBean(SpringUtils.java:26) at com.hvisen.springboot.ApplicationLauncher.run(ApplicationLauncher.java:28) at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:813) ... 10 common frames omitted
程序在啟動之后,自動退出了。
問題分析:
對於應用來說,無需監聽,在執行完任務之后,就自動退出,這個是非常正常的情況。那該如何做才能在后台讓其一直運行呢?
辦法也很簡單,就是利用Thread.join()功能來實現,讓主線程等待當前線程的退出,當前線程一直執行,不自動退出,則可以形成一個監聽狀態的應用。
解決代碼如下:
import com.hvisen.springboot.base.TaskStarter; import com.hvisen.springboot.utils.SpringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String[] args) throws Exception { Thread.currentThread().join(); //需要啟動的代碼邏輯 } }