如何根据配置服务器以编程方式控制应用程序的启动?我有 sh 脚本用于控制 docker-compose up,但我想知道我可以在 spring 应用程序中以编程方式控制它。
问候
如果你在 Ubuntu 上,那么以下解决方案将完美运行。如果您使用的是其他发行版,并且ps -A
不起作用,那么请找到等效的发行版。现在,在下面谈谈策略是如何完成的。我希望我的应用程序由脚本启动,因为它包含一些 JVM 参数。因此,当我的应用程序运行时,脚本也将位于活动进程列表中。启动完成后,应用程序会查找我的脚本文件是否存在于活动进程列表中。如果不存在,则关闭应用程序。以下示例可能会让您了解如何使用配置服务器实现相同的功能。
@Autowired
private ApplicationContext context;
@EventListener(ApplicationReadyEvent.class) // use in production
public void initiateStartup() {
try {
String shProcessName = "root-IDEA.sh";
String line;
boolean undesiredStart = true;
Process p = Runtime.getRuntime().exec("ps -A");
InputStream inputStream = p.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
while ((line = bufferedReader.readLine()) != null) {
if (line.contains(shProcessName)) {
undesiredStart = false;
break;
}
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
if (undesiredStart) {
System.out.println("--------------------------------------------------------------------");
System.out.println("APPLICATION STARTED USING A DIFFERENT CONFIG. PLEASE START USING THE '.sh' FILE.");
System.out.println("CLOSING APPLICATION");
System.out.println("--------------------------------------------------------------------");
// close the application
int exitCode = SpringApplication.exit(context, (ExitCodeGenerator) () -> 0);
System.exit(exitCode);
}
System.out.println("APPLICATION STARTED CORRECTLY");
} catch (IOException e) {
e.printStackTrace();
}
}