-
Notifications
You must be signed in to change notification settings - Fork 0
/
task.go
62 lines (50 loc) · 1.64 KB
/
task.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// mogul - distributed lock & task management via mongoDB
//
// Copyright 2016 - Rene Kroon <kroon.r.w@gmail.com>
//
package mogul
import (
"time"
"github.com/globalsign/mgo"
"github.com/globalsign/mgo/bson"
)
// Task is the entity we work with to regulate jobs. It consists of a name and a payload.
// If a task is claimed the user and optinal expiresAtUtc will be filled.
type Task struct {
Name string `bson:"_id"`
User *string `bson:"user,omitempty"`
Data []byte `bson:"task"`
ExpiresAtUtc *time.Time `bson:"expires,omitempty"`
Doc meta `bson:",inline"`
collection *mgo.Collection `bson:"-"`
}
// If the task has been completed succesfully we remove it from the database.
func (t *Task) Complete() error {
return t.collection.Remove(t.identity())
}
// If the task failed we remove our claim on the task, to make it available again.
// The job will be run again. If you don't want this then call Complete.
func (t *Task) Failed() error {
fields := bson.M{"user": ""}
fields["expires"] = ""
unset := bson.M{"$unset": fields}
return t.collection.Update(t.identity(), unset)
}
// You can cast the Manager object to a TaskHandler to have a dedicated object
// for modifying tasks.
type TaskHandler interface {
Add(name string, data []byte) error
Next(user string, leaseTime *time.Duration) (*Task, error)
}
type meta struct {
Location []float64 `bson:"location"`
}
type geoJson struct {
Type string `json:"-"`
Coordinates []float64 `json:"coordinates"`
}
func (t *Task) identity() bson.M {
fields := bson.M{"_id": t.Name}
fields["user"] = t.User
return fields
}