Skip to content

Commit

Permalink
Merge pull request #31 from BrettRToomey/vapor-2-beta
Browse files Browse the repository at this point in the history
Updated for Vapor 2.0 beta. Removed Core dependency.
  • Loading branch information
BrettRToomey committed Mar 30, 2017
2 parents 8227351 + d2e42f2 commit f3c0a6a
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 39 deletions.
6 changes: 1 addition & 5 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import PackageDescription

let package = Package(
name: "Jobs",
dependencies: [
.Package(url: "https://github.com/vapor/core.git", majorVersion: 1)
//.Package(url: "https://github.com/vdka/JSON", majorVersion: 0, minor: 16)
]
name: "Jobs"
)
82 changes: 48 additions & 34 deletions Sources/Jobs.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import Core
import Dispatch
import Foundation

Expand Down Expand Up @@ -71,7 +70,7 @@ public class Job: Performable {
let action: Action
let errorCallback: ErrorCallback?

let lock = Lock()
let lock = NSLock()

init(
name: String?,
Expand Down Expand Up @@ -99,37 +98,43 @@ public class Job: Performable {

/// Stops a job.
public func stop() {
lock.locked {
isRunning = false
lock.lock()
defer {
lock.unlock()
}

isRunning = false
}

func perform() {
lock.locked {
guard isRunning else {
return
}

do {
try action()
Jobs.shared.queue(self)
} catch {
guard
let recoveryStrategy = errorCallback?(error),
recoveryStrategy != .default
lock.lock()
defer {
lock.unlock()
}

guard isRunning else {
return
}

do {
try action()
Jobs.shared.queue(self)
} catch {
guard
let recoveryStrategy = errorCallback?(error),
recoveryStrategy != .default
else {
//default recovery strategy
Jobs.shared.queue(self, in: 5.seconds)
return
}
}

switch recoveryStrategy {
case .retry(let deadline):
Jobs.shared.queue(self, in: deadline)

switch recoveryStrategy {
case .retry(let deadline):
Jobs.shared.queue(self, in: deadline)

default:
break
}
default:
break
}
}
}
Expand All @@ -139,7 +144,7 @@ public final class Jobs {
//consider making `lock` and `workerQueue` static to remove singleton.
static let shared = Jobs()

let lock = Lock()
let lock = NSLock()
let workerQueue = DispatchQueue(label: "jobs-worker")

/**
Expand Down Expand Up @@ -296,24 +301,33 @@ public final class Jobs {

func queue(_ dispatchItem: DispatchWorkItem, deadline: Duration) {
let deadline: DispatchTime = .now() + deadline.unixTime
lock.locked {
workerQueue.asyncAfter(deadline: deadline, execute: dispatchItem)
lock.lock()
defer {
lock.unlock()
}

workerQueue.asyncAfter(deadline: deadline, execute: dispatchItem)
}

func queue(_ job: Performable, in deadline: Duration) {
let deadline: DispatchTime = .now() + deadline.unixTime
lock.locked {
workerQueue.asyncAfter(deadline: deadline, execute: job.perform)
lock.lock()
defer {
lock.unlock()
}

workerQueue.asyncAfter(deadline: deadline, execute: job.perform)
}

func queue(_ job: Performable, performNow: Bool = false) {
lock.locked {
workerQueue.asyncAfter(
deadline: performNow ? .now() : .now() + job.interval,
execute: job.perform
)
lock.lock()
defer {
lock.unlock()
}

workerQueue.asyncAfter(
deadline: performNow ? .now() : .now() + job.interval,
execute: job.perform
)
}
}

0 comments on commit f3c0a6a

Please sign in to comment.