THIS IS PLANITAR's FORK of jrallison/go-workers
Modifications to the vanilla version include:
NowToSecondsWithNanoPrecision()is exported in the packagePrepareEnqueuMsg()andEnqueueMsg()are addedMaxAttemptsfield was added toEnqueueOptionsstruct
Sidekiq compatible background workers in golang.
- reliable queueing for all queues using brpoplpush
 - handles retries
 - support custom middleware
 - customize concurrency per queue
 - responds to Unix signals to safely wait for jobs to finish before exiting.
 - provides stats on what jobs are currently running
 - well tested
 
Example usage:
package main
import (
	"github.com/PlanitarInc/go-workers"
)
func myJob(message *workers.Msg) {
  // do something with your message
  // message.Jid()
  // message.Args() is a wrapper around go-simplejson (http://godoc.org/github.com/bitly/go-simplejson)
}
type myMiddleware struct{}
func (r *myMiddleware) Call(queue string, message *workers.Msg, next func() bool) (acknowledge bool) {
  // do something before each message is processed
  acknowledge = next()
  // do something after each message is processed
  return
} 
func main() {
  workers.Configure(map[string]string{
    // location of redis instance
    "server":  "localhost:6379",
    // instance of the database
    "database":  "0",
    // number of connections to keep open with redis
    "pool":    "30",
    // unique process id for this instance of workers (for proper recovery of inprogress jobs on crash)
    "process": "1",
  })
  workers.Middleware.Append(&myMiddleware{})
  // pull messages from "myqueue" with concurrency of 10
  workers.Process("myqueue", myJob, 10)
  // pull messages from "myqueue2" with concurrency of 20
  workers.Process("myqueue2", myJob, 20)
  // Add a job to a queue
  workers.Enqueue("myqueue3", "Add", []int{1, 2})
  // stats will be available at http://localhost:8080/stats
  go workers.StatsServer(8080)
  // Blocks until process is told to exit via unix signal
  workers.Run()
}Initial development sponsored by Customer.io

