public function releaseJob($id, $delay = 0)
{
$payload = $this->getPayload($id);
if ($payload[self::JOB_PAYLOAD_STATE] !== self::STATE_RESERVED) {
throw new QueueException(' Cannot release state unsupported! ' . $payload[self::JOB_PAYLOAD_STATE]);
}
$keyReady = $this->getKeyReady($payload[self::JOB_PAYLOAD_QUEUE]);
$keyDelayed = $this->getKeyDelayed($payload[self::JOB_PAYLOAD_QUEUE]);
$keyReserved = $this->getKeyReserved($payload[self::JOB_PAYLOAD_QUEUE]);
$redisJobNamespace = $this->getRedisJobNamespace();
$result = $this->getRedis()->transaction(function ($tx) use($id, $payload, $delay, $keyReady, $keyDelayed, $keyReserved, $redisJobNamespace) {
/** @var $tx \Predis\Client */
$tx->zrem($keyReserved, $id);
$payload = self::buildPayload($payload[self::JOB_PAYLOAD_QUEUE], $delay ? self::STATE_DELAYED : self::STATE_READY);
$tx->hset($redisJobNamespace, $id, $payload);
if ($delay == 0) {
$tx->rpush($keyReady, $id);
} else {
$tx->zadd($keyDelayed, $this->getTime() + $delay, $id);
}
});
return !in_array(false, $result);
}