spring - Spring Boot 中的计划方法
问题描述
我想在一段时间内发送一个帖子请求。我创建了这样的方法;
@Scheduled(cron = "0 0 */6 * *")
@PostMapping
public List<TagsRes> getTags(Date date) {
return null;
}
@Scheduled(cron = "0 0 5 * * ?")
@PostMapping
public List<TagsRes> getAll() {
return null;
}
我应该在我的控制器中使用@Scheduled 吗?有没有更好的方法呢?
谢谢!
解决方案
控制器旨在接收 Web 请求,而不是发布任何内容。您可以将它们视为由您的应用程序公开并由外部服务不时调用的端点。
现在,Controller 抽象本身应该执行任何业务逻辑。您可能想要验证请求中接收到的一些参数,可能需要通过一些自定义将请求参数转换为 java 对象,然后调用实际执行您的业务逻辑的类(通常在 Spring Universe 中称为 Service)。
现在回到你的问题。我怀疑您不应该“发布请求”,而应该调用一些代码“就好像有人调用了控制器的方法(端点)”。但这一次不是外部“用户”会导致代码执行,而是内部调度程序。
如果是这样,您可以稍微重构代码以获得更好的清晰度:
- 创建一个将执行代码的服务
- 不要在控制器上放置任何与调度相关的东西
- 从控制器调用服务
- 创建一个 bean 并在其上放置一个“@Scheduled”方法。bean 将注入服务并像控制器一样调用它。
不要忘记添加@EnableScheduling
注释 - 否则计划的代码将无法运行。
public class MyService {
public void doBusinessLogic(){ ... }
}
@RestController
public class MyController {
@Autowired
private MyService service;
public void myPostMethod(...) {
service.doBusinessLogic(...);
}
}
public class MyScheduledInvoker {
@Autowired
private MyService service;
@Scheduled(...cron expression or whatever...)
public void invokeScheduled() {
service.doBusinessLogic(...);
}
}
@SpringBootApplication
@EnableScheduling
public class MyApp {
public static void main(String [] args) { .... run the app ...}
}
推荐阅读
- javascript - JavaScript setTimeout 无递归无限循环
- ios - 为什么 QR Scanner Ionic 插件会产生错误?
- typescript - 在 TypeScript 中使用映射类型时更严格的联合类型
- python - GTK、Glade 和 Python 使用 connect_signals 连接来自多个类的处理程序
- python - lock.acquire 是否阻塞非关键部分中的进程
- python - 列表理解语法错误
- php - 提交 Google 自定义搜索
- sql - SQL - 计算百分比增加?
- php - 共享服务器上的 Codeigniter Php.ini 文件位置以增加文件上传限制
- vba - 用非易失性VBA方法替换Indirect,但不能用OFFSET等Excel函数嵌套返回值?