| | |
| | | exit; |
| | | } |
| | | |
| | | use JVBase\managers\CustomTable; |
| | | use Exception; |
| | | use JVBase\Instance; |
| | | use JVBase\managers\AdminPages; |
| | | use JVBase\managers\Errors; |
| | | use JVBase\rest\routes\QueueRoutes; |
| | | use Throwable; |
| | | use WP_Error; |
| | | use WP_REST_Request; |
| | | use WP_REST_Response; |
| | | |
| | | class Queue |
| | | { |
| | | use Instance; |
| | | private Storage $storage; |
| | | private Processor $processor; |
| | | private TypeRegistry $registry; |
| | | public Executor $executor; |
| | | private Locker $locker; |
| | | |
| | | public function __construct() |
| | | private QueueRoutes $routes; |
| | | |
| | | private function __construct() |
| | | { |
| | | //Load routes |
| | | $this->routes = new QueueRoutes(); |
| | | |
| | | $this->storage = new Storage(); |
| | | $this->registry = new TypeRegistry(); |
| | | $this->locker = new Locker(); |
| | |
| | | 'updated_existing' => false, |
| | | ]; |
| | | |
| | | } catch (\Exception $e) { |
| | | JVB()->error()->log('queue', $e->getMessage(), $data, 'high'); |
| | | } catch (Exception $e) { |
| | | Errors::getInstance()->log('queue', $e->getMessage(), $data, 'high'); |
| | | return new WP_Error('queue_failed', $e->getMessage()); |
| | | } |
| | | } |
| | |
| | | /** |
| | | * Try to merge incoming operation into an existing pending/scheduled one. |
| | | * Returns result array if merged, null if not. |
| | | * @throws \Throwable |
| | | * @throws Throwable |
| | | */ |
| | | private function tryMerge(Operation $incoming): ?array |
| | | { |
| | |
| | | public function maintenance(): void |
| | | { |
| | | $this->locker->withLock(function () { |
| | | $this->storage->resetStuckOperations(30); |
| | | $this->storage->resetStuckOperations(); |
| | | }); |
| | | $this->runQueueOnShutdown(); |
| | | } |
| | |
| | | /** |
| | | * Get a specific value from an operation - backwards compatibility |
| | | */ |
| | | public function getOperationValue(string $id, string $column, bool $decodeJson = true): mixed |
| | | public function getOperationValue(string $id, string $column, bool $decodeJson = true): \static|string|int|array|null |
| | | { |
| | | $op = $this->get($id); |
| | | if (!$op) { |
| | |
| | | // Use provided operation_id or generate one |
| | | $op->id = !empty($options['operation_id']) |
| | | ? $options['operation_id'] |
| | | : 'u' . $userId . '_' . uniqid('op_'); |
| | | : self::generateID($userId); |
| | | |
| | | $op->type = $type; |
| | | $op->userId = $userId; |
| | |
| | | |
| | | private function runQueueOnShutdown(): void |
| | | { |
| | | if (!has_action('shutdown', [$this, 'processQueueOnShutdown'])) { |
| | | if (!has_action('shutdown', [$this, 'processQueueOnShutdown']) && $this->processor->hasAdequateResources()) { |
| | | add_action('shutdown', [$this, 'processQueueOnShutdown'], 100); |
| | | } |
| | | } |
| | |
| | | |
| | | public function registerAdminAction():void |
| | | { |
| | | $admin = JVB()->admin(); |
| | | $admin = AdminPages::getInstance(); |
| | | $admin->registerAction( |
| | | 'Restart Stuck Operations', |
| | | 'restart-stuck-operations', |
| | |
| | | return $response; |
| | | } |
| | | } |
| | | |
| | | public static function generateId(int $userID):string |
| | | { |
| | | return 'u' . $userID . '_' . uniqid('op_'); |
| | | } |
| | | } |