Spring Boot - 无限循环服务

时间:2016-04-11 06:59:50

标签: java service spring-boot infinite-loop headless

我想构建一个无头应用程序,它将在无限循环中查询数据库并在某些条件下执行某些操作(例如,获取具有特定值的记录,以及在为每条消息找到启动电子邮件发送过程时)。

我想使用Spring Boot作为基础(特别是因为Actuator允许公开健康检查),但是现在我使用Spring Boot来构建REST Web服务。

构建无限循环应用程序时是否有任何最佳实践或模式?有没有人试图基于Spring Boot构建它,并且可以与我分享他的架构?

最好的问候。

3 个答案:

答案 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();
    }
}