我正在使用Spring Boot构建一个命令行java应用程序,以使其快速运行。
应用程序加载不同类型的文件(例如CSV)并将它们加载到Cassandra数据库中。它不使用任何Web组件,它不是Web应用程序。
我遇到的问题是在工作完成后停止应用程序。我正在使用带有@Component
的Spring CommandLineRunner接口来运行任务,如下所示,但是当工作完成后,应用程序不会停止,它会因某些原因而继续运行,我无法找到阻止它的方法。
@Component
public class OneTimeRunner implements CommandLineRunner {
@Autowired
private CassandraOperations cassandra;
@Autowired
private ConfigurableApplicationContext context;
@Override
public void run(String... args) throws Exception {
// do some work here and then quit
context.close();
}
}
更新:问题似乎是spring-cassandra
,因为项目中没有其他内容。有谁知道为什么它会阻止线程在后台运行以阻止应用程序停止?
更新:更新到最新的春季启动版本后,问题就消失了。
答案 0 :(得分:25)
我找到了解决方案。你可以用这个:
<div class="box one">1</div>
<div class="box two">2</div>
.box {
font-size: 40px;
margin: 5px;
width: 300px;
height: 150px;
}
.one{
float: left;
border: 5px solid rgba(255, 154, 188, 0.9);
background-color: rgba(255, 165, 0, 0.25);
}
.two {
position: relative;
top: 170px;
border: 5px solid rgba(35, 154, 255, 0.5);
background-color: rgba(100, 165, 255, 0.25);
}
只需在运行时使用.close。
答案 1 :(得分:15)
答案取决于仍然在做什么。你可以找到一个线程转储(例如使用jstack)。但如果它是由Spring启动的任何内容,您应该能够使用ConfigurableApplicationContext.close()
来停止main()方法(或CommandLineRunner
)中的应用。
答案 2 :(得分:8)
这是@EliuX回答与@Quan Vo回复的组合。谢谢你们两个!
主要的不同之处在于我将SpringApplication.exit(context)响应代码作为参数传递给System.exit(),因此如果关闭Spring上下文时出错,您会注意到。
SpringApplication.exit()将关闭Spring上下文。
System.exit()将关闭应用程序。
@Component
public class OneTimeRunner implements CommandLineRunner {
@Autowired
private ConfigurableApplicationContext context;
@Override
public void run(String... args) throws Exception {
System.exit(SpringApplication.exit(context));
}
}
答案 3 :(得分:5)
我在当前项目(spring boot应用程序)中也遇到了这个问题。 我的解决方案是:
// releasing all resources
((ConfigurableApplicationContext) ctx).close();
// Close application
System.exit(0);
context.close()
不要停止我们的控制台应用程序,它只是释放资源。
答案 4 :(得分:1)
使用org.springframework.boot.SpringApplication#exit
。 E.g。
@Component
public class OneTimeRunner implements CommandLineRunner {
@Autowired
private ConfigurableApplicationContext context;
@Override
public void run(String... args) throws Exception {
SpringApplication.exit(context);
}
}
答案 5 :(得分:0)
您可以尝试-
public void run(String... arg0) throws Exception {
int response = -1;
try {
/*Do you job here and get a response code*/
System.exit(response); //success response
} catch (Exception e) {
System.exit(response); //failure response
}
}