我想构建一个无头应用程序,它将在无限循环中查询数据库并在某些条件下执行某些操作(例如,获取具有特定值的记录,以及在为每条消息找到启动电子邮件发送过程时)。
我想使用Spring Boot作为基础(特别是因为Actuator允许公开健康检查),但是现在我使用Spring Boot来构建REST Web服务。
构建无限循环应用程序时是否有任何最佳实践或模式?有没有人试图基于Spring Boot构建它,并且可以与我分享他的架构?
最好的问候。
答案 0 :(得分:14)
不要自己实现无限循环。让框架使用其task execution功能处理它:
@Service
public class RecordChecker{
//Executes each 500 ms
@Scheduled(fixedRate=500)
public void checkRecords() {
//Check states and send mails
}
}
不要忘记为您的应用程序启用计划:
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class);
}
}
另见:
答案 1 :(得分:6)
我正在使用的是消息代理和消费者放在spring boot应用程序中来完成这项工作。
答案 2 :(得分:0)
有几种选择。我的方法是在ApplicationReadyEvent上启动循环,然后将循环逻辑抽象为可注入服务。就我而言,这是一个游戏循环,但是这种模式也应该对您有用。
package com.ryanp102694.gameserver;
import com.ryanp102694.gameserver.service.GameProcessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class GameLauncher implements ApplicationListener<ApplicationReadyEvent> {
private static Logger logger = LoggerFactory.getLogger(GameLauncher.class);
private GameProcessor gameProcessor;
@Autowired
public GameLauncher(GameProcessor gameProcessor){
this.gameProcessor = gameProcessor;
}
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
logger.info("Starting game process.");
gameProcessor.start();
while(gameProcessor.isRunning()){
logger.debug("Collecting user input.");
gameProcessor.collectInput();
logger.debug("Calculating next game state.");
gameProcessor.nextGameState();
logger.debug("Updating clients.");
gameProcessor.updateClients();
}
logger.info("Stopping game process.");
gameProcessor.stop();
}
}