英文:
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
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论