如何使用github.com/robfig/cron找到特定的正在运行的cron作业?

huangapple go评论89阅读模式
英文:

How to find a particular running cron jobs with github.com/robfig/cron?

问题

我们如何在 github.com/robfig/cron 中查找特定的正在运行的 cron 作业?

在一个通知服务中,我们将通知存储在数据库中,每个通知要么立即发送(给用户),要么是预定发送的。

预定发送的通知使用 cron 作业发送。如果一个预定发送的通知在发送之前被删除了,我们如何查找要删除的 cron 作业?

英文:

How do we look for particular running cron jobs within github.com/robfig/cron?

In a notification service, where we store notifications in database, each notification either is to send (to user) immediately or scheduled.

The scheduled ones are sent using cron jobs. If a scheduled notification was deleted before it sent, how do we look for the cron job to be deleted?

答案1

得分: 1

使用github.com/robfig/cron/v3库,你可以使用Cron.Entry

以下是一个基本的使用示例:

job := cron.FuncJob(func() {
	fmt.Println("Hello Cron")
})

c := cron.New(/* options */) 
entryId := c.Schedule(cron.Every(time.Second*5), job)

// 查找作业条目
entry := c.Entry(entryId)
// ... 在这里你可以检查作业`entry`

// 移除条目,它将不再运行
c.Remove(entryId)

cron.FuncJob实际上只是func()的一个包装器。如果你需要更复杂的行为或状态,你可以自己实现Job接口:

type myJob struct{}

func (j *myJob) Run() {
	fmt.Println("foo")
}

然后,你可以通过类型断言获取你的作业的特定实例:

j := c.Entry(id).Job.(*myJob)
// ... 使用*myJob实例进行操作

你还可以通过实现Schedule接口来自定义调度:

type mySchedule struct{}

// Next返回下一个激活时间,晚于给定时间。
// Next在初始时调用,然后每次运行作业时都会调用。
func (s *mySchedule) Next(time.Time) time.Time {
    return time.Now().Add(time.Second*5)
}

然后像这样使用它们:

c := cron.New(/* options */) 
entryId := c.Schedule(&mySchedule{}, &myJob{})

如果你使用的是该包的早期版本,不幸的是你无法通过id获取单个条目,Cron.Schedule也不会分配id。你必须自己管理查找表。如果可能的话,我建议升级到v3版本。

英文:

With github.com/robfig/cron/v3 You can use Cron.Entry.

This is a basic usage example:

job := cron.FuncJob(func() {
	fmt.Println("Hello Cron")
})

c := cron.New(/* options */) 
entryId := c.Schedule(cron.Every(time.Second*5), job)

// Find the job entry
entry := c.Entry(entryId)
// ... here you can inspect the job `entry`

// Removes the entry, it won't run again
c.Remove(entryId)

cron.FuncJob is actually just a wrapper around func(). In case you need more complex behavior, or state, you can implement the Job interface yourself:

type myJob struct{}

func (j *myJob) Run() {
	fmt.Println("foo")
}

Then you can fetch the specific instance of your job by type-asserting:

j := c.Entry(id).Job.(*myJob)
// ... do something with the *myJob instance

You can also customize the schedule, by implementing Schedule interface:

type mySchedule struct{}

// Next returns the next activation time, later than the given time.
// Next is invoked initially, and then each time the job is run.
func (s *mySchedule) Next(time.Time) time.Time {
    return time.Now().Add(time.Second*5)
}

And then use it all like:

c := cron.New(/* options */) 
entryId := c.Schedule(&mySchedule{}, &myJob{})

<hr>

If you use an earlier version of the package, unfortunately you can't get a single entry by id and Cron.Schedule doesn't assign ids either. You must manage a lookup table yourself. If possible, I recommend upgrading to v3.

huangapple
  • 本文由 发表于 2021年7月12日 15:29:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/68343512.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定