registrar-log-solo-si-se-ejecuta-el-job#2006
Open
elguitarraverde wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Descripción
El cambio corrige que el cron registrase running-plugin-cron al detectar una clase Cron de plugin, aunque ninguno de sus trabajos estuviera listo para ejecutarse.
Antes el flujo era:
Core\Controller\Cron::runPlugins() recorría plugins activos.
Si existía FacturaScripts\Plugins\X\Cron, escribía siempre:
Después instanciaba el cron del plugin y llamaba a run().
Dentro del plugin, cada trabajo llamaba a $this->job(...)->every(...)->run(...).
CronJob::run() comprobaba isReady() y podía devolver false sin ejecutar nada.
El bug estaba en que el log ocurría en el paso 2, antes de saber si algún CronJob iba a pasar isReady().
Ahora el flujo queda así:
Core\Controller\Cron::runPlugins() solo detecta e instancia la clase Cron del plugin.
Ya no registra ni imprime running-plugin-cron de forma anticipada.
El plugin ejecuta su método run() como antes.
Cada trabajo se obtiene con CronClass::job().
CronClass::job() asigna al CronJob un callback interno mediante setReadyCallback().
El plugin sigue llamando igual:
$this->job('name')->every(...)->run(function () {
...
});
CronJob::run() comprueba primero isReady().
Si isReady() es false, devuelve false y no ejecuta ni el callback ni el trabajo.
Si isReady() es true, guarda el estado inicial del job y entonces ejecuta el callback.
Ese callback imprime y registra running-plugin-cron.
Después se ejecuta el closure real del trabajo.
Al terminar, CronJob::run() mantiene el comportamiento anterior: duración, done, failed, running, daily_exec, control de excepciones y logs críticos.
La retrocompatibilidad se mantiene porque no cambia la API usada por los plugins. CronJob::run(Closure $function): bool conserva firma y comportamiento externo; solo se añade un hook opcional que el core usa
internamente para retrasar el log hasta el punto correcto.
Además, CronClass evita duplicar el mensaje con una bandera interna: si un plugin tiene varios jobs listos en la misma ejecución, running-plugin-cron se registra una sola vez por plugin.