Spring 启动 - 无限循环服务
Spring Boot - infinite loop service
我想构建一个无头应用程序,它将在无限循环中查询数据库并在特定条件下执行某些操作(例如,获取具有特定值的记录,并在找到时为每条消息启动电子邮件发送程序)。
我想使用 Spring Boot 作为基础(特别是因为 Actuator 允许公开健康检查),但现在我使用 Spring Boot 来构建 REST Web 服务。
在构建无限循环应用程序时是否有可遵循的最佳实践或模式?有没有人尝试基于 Spring Boot 构建它并且可以与我分享他在这种情况下的架构?
此致。
我正在使用的是一个消息代理和一个放置在 spring 启动应用程序中的消费者来完成这项工作。
不要自己实现无限循环。让框架使用其 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);
}
}
另请参阅:
有几个选项。我的方法是在 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();
}
}
我想构建一个无头应用程序,它将在无限循环中查询数据库并在特定条件下执行某些操作(例如,获取具有特定值的记录,并在找到时为每条消息启动电子邮件发送程序)。
我想使用 Spring Boot 作为基础(特别是因为 Actuator 允许公开健康检查),但现在我使用 Spring Boot 来构建 REST Web 服务。
在构建无限循环应用程序时是否有可遵循的最佳实践或模式?有没有人尝试基于 Spring Boot 构建它并且可以与我分享他在这种情况下的架构?
此致。
我正在使用的是一个消息代理和一个放置在 spring 启动应用程序中的消费者来完成这项工作。
不要自己实现无限循环。让框架使用其 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);
}
}
另请参阅:
有几个选项。我的方法是在 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();
}
}