【发布时间】:2019-01-22 04:46:04
【问题描述】:
我们正在 OpenShift 中部署我们的 Spring Boot 应用程序。
目前,我们正在尝试在完全设置 webcontext 之前运行一个可能需要长时间运行的任务(数据库迁移)。 在迁移完全运行之前,应用程序不接受 REST 请求或处理消息尤为重要。 请参阅以下最小示例:
// DemoApplication.java
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
// MigrationConfig.java
@Configuration
@Slf4j
public class MigrationConfig {
@PostConstruct
public void run() throws InterruptedException {
log.info("Migration...");
// long running task
Thread.sleep(10000);
log.info("...Migration");
}
}
// Controller.java
@RestController
public class Controller {
@GetMapping("/test")
public String test() {
return "test";
}
}
// MessageHandler.java
@EnableBinding(Sink.class)
public class MessageHandler {
@StreamListener(Sink.INPUT)
public void handle(String message) {
System.out.println("Received: " + message);
}
}
到目前为止,这工作正常:在应用响应请求之前处理自动配置类。 然而,我们担心的是 OpenShifts 就绪探测:目前我们使用执行器健康端点来检查应用程序是否启动并运行。 如果迁移需要很长时间,OpenShift 可能会停止容器,从而可能使我们在数据库中出现不一致的状态。
是否有人知道我们如何传达应用程序正在启动,但阻止 REST 控制器或消息处理程序运行?
编辑
有多种方法可以阻止传入的 REST 请求,@martin-frey 建议使用 servletfilter。
对我们来说更大的问题是流监听器。我们使用Spring Cloud Stream 来监听 RabbitMQ 队列。 我在上面的示例中添加了一个示例处理程序。 你对如何“暂停”有什么建议吗?
【问题讨论】:
标签: spring spring-boot kubernetes openshift spring-boot-actuator