使用Extbase CommandController创建TYPO3调度任务时如何标记任务失败?
在Extbase CommandController中标记TYPO3调度任务失败的正确方式
这个问题我之前也踩过坑,Extbase的CommandController确实没法用普通的return false来告知调度器任务失败——因为调度器是通过命令行退出状态码来判断任务结果的,而Extbase会忽略你方法的返回值。下面给你两种靠谱的实现方案:
方案1:使用sendError()方法
这是Extbase CommandController内置的方法,既能输出错误信息,又会自动设置非0的退出码(默认是1),调度器能直接识别到失败:
/** * 自定义调度任务命令 */ public function myScheduledTaskCommand() { // 执行你的任务逻辑 $taskSuccess = $this->doTaskLogic(); if (!$taskSuccess) { // 发送错误消息并标记失败,第二个参数是退出码(非0即可) $this->sendError('任务执行失败:数据处理出错', 1); } // 正常完成的逻辑 $this->outputLine('任务执行成功'); }
方案2:抛出CommandFailedException异常
如果你想用异常的方式处理错误,可以抛出TYPO3核心提供的CommandFailedException,这个异常会被命令行处理机制捕获,并返回对应的非0退出码:
use TYPO3\CMS\Core\Command\CommandFailedException; /** * 自定义调度任务命令 */ public function myScheduledTaskCommand() { // 执行你的任务逻辑 $taskSuccess = $this->doTaskLogic(); if (!$taskSuccess) { // 抛出异常,第二个参数是退出码 throw new CommandFailedException('任务执行失败:无法连接到数据库', 2); } // 正常完成的逻辑 $this->outputLine('任务执行成功'); }
关键原理说明
调度器判断任务成功与否的核心是命令行的退出状态码:
- 退出码为
0:任务成功 - 退出码为非0:任务失败
普通的return false不会改变命令的默认退出码(还是0),所以调度器会误判为成功。而上面两种方法都会主动设置非0的退出码,让调度器正确识别任务状态。
内容的提问来源于stack exchange,提问作者Sven
相关产品推荐
相关产品推荐

