给力小青年|Go 每日一库之 jobrunner
以下文章来源于GoUpUp, 作者dj
简介我们在 Web 开发中时常会遇到这样的需求 , 执行一个操作之后 , 需要给用户一定形式的通知 。 例如 , 用户下单之后通过邮件发送电子发票 , 网上购票支付后通过短信发送车次信息 。 但是这类需求并不需要非常及时 , 如果放在请求流程中处理 , 会影响请求的响应时间 。 这类任务我们一般使用异步的方式来执行 。 jobrunner就是其中一个用来执行异步任务的 Go 语言库 。 得益于强大的cron库 , 再搭配jobrunner的任务状态监控 , jobrunner非常易于使用 。
快速使用本文使用 Go Modules 。
创建目录并初始化:
$ mkdir jobrunner && cd jobrunner$ go mod init github.com/darjun/go-daily-lib/jobrunner
安装jobrunner:
$ go get -u github.com/bamzi/jobrunner
【给力小青年|Go 每日一库之 jobrunner】使用:
package mainimport ("fmt""time""github.com/bamzi/jobrunner")type GreetingJob struct {Name string}func (g GreetingJob) Run() {fmt.Println("Hello, ", g.Name)}func main() {jobrunner.Start()jobrunner.Schedule("@every 5s", GreetingJob{Name: "dj"})time.Sleep(10 * time.Second)}
我们创建一个任务 , 每隔 5s 打印一条欢迎信息 。 任务的创建和执行与cron完全相同 , 详细使用见我前面的一篇博文 。
注意 , jobrunner需要先Start() , 然后再添加任务 。 因为在Start()中创建MainCron对象 , 先添加任务会panic!!!
注意main函数尾的time.Sleep(10 * time.Second) , 因为主 goroutine 结束之后整个程序就退出了 , jobrunner中的任务就没有机会被执行了 。 加上time.Sleep是为了让大家能看到输出 , 实际使用中不会这样做 。
与 web 框架整合jobrunner能很方便地与当前常见的 Web 框架整合 , 如Gin/Echo/Martini/Beego/Revel等 。 下面通过一个简单的例子演示如何在 Gin 中使用jobrunner:用户登录时给他的邮箱发送一封邮件 。
首先需要安装相应的库:
$ go get -u github.com/gin-gonic/gin$ github.com/jordan-wright/email
编写代码:
package mainimport ("fmt""net/smtp""time""github.com/bamzi/jobrunner""github.com/gin-gonic/gin""github.com/jordan-wright/email")type EmailJob struct {NamestringEmail string}type User struct {Namestring `form:"name"`Email string `form:"email"`}func (j EmailJob) Run() {e := email.NewEmail()e.From = "leedarjun@126.com"e.To = []string{j.Email}e.Cc = []string{"leedarjun@126.com"}e.Subject = "Welcome To Awesome-Web"e.Text = []byte(fmt.Sprintf(`Hello, %sWelcome Back`, j.Name))err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "leedarjun@126.com", "yyyyyy", "smtp.126.com"))if err != nil {fmt.Printf("failed to send email to %s, err:%v", j.Name, err)}}func login(c *gin.Context) {var u Userif c.ShouldBind(&u) == nil {c.String(200, "login success")jobrunner.In(5*time.Second, EmailJob{Name: u.Name, Email: u.Email})} else {c.String(404, "login failed")}}func main() {r := gin.Default()r.GET("/login", login)r.Run(":8888")}
这里只是为了简单演示 , 我们编写了一个简陋的login函数处理登录 , 传入name和email , 然后给该email发送邮件 。 email库的详细使用可以查看我之前的博文了解 。
只需要在浏览器中输入http://localhost:8888/login?name=dj&email=935653229@qq.com , 我的 QQ 邮箱就能收到邮件:
监控jobrunner内置了一个监控模块 , 可以很方便地通过网页或者 API 获取当前的任务状态数据:
推荐阅读
- 天秤座每日运势|天秤座每日运势2020年10月20日2020/10/20 #天秤座# 每日运势
- 安卓每日推送|淘汰有线充电!19分钟就能充满电
- 净利|每日净赚超7600万元 牧原股份前三季净利增14倍
- |每日撸报:TheShy直播透露明年可能是Rookie最后一年
- 每日搭配指南|懂穿搭的女人才会美,秋季简单又高级的“叠穿”示范,谁穿谁好看
- 帅帅的龙仔|你确定画完以后不会被打么?,每日一笑:大师
- Buy遍全球1004|每日一葩:人生中第一个差评竟是因为绿色赠品?
- 每日搭配指南|秋季学院风半身长裙穿搭示范,优雅减龄又显气质,太好看了
- 每日汽车新闻|外观比炮更霸气,江淮悍途将上市,国产版的“猛禽”
- 美美姐见闻|每日爆笑:我到底该不该留下吃饭呢?