首页 > 其他分享 >Go每日一库之50:jobrunner

Go每日一库之50:jobrunner

时间:2023-09-28 14:36:33浏览次数:42  
标签:github Name jobrunner 50 一库 time Go gin com

简介

我们在 Web 开发中时常会遇到这样的需求,执行一个操作之后,需要给用户一定形式的通知。例如,用户下单之后通过邮件发送电子发票,网上购票支付后通过短信发送车次信息。但是这类需求并不需要非常及时,如果放在请求流程中处理,会影响请求的响应时间。这类任务我们一般使用异步的方式来执行。jobrunner就是其中一个用来执行异步任务的 Go 语言库。得益于强大的cron库,再搭配jobrunner的任务状态监控,jobrunner非常易于使用。

快速使用

本文使用 Go Modules。

创建目录并初始化:

$ mkdir jobrunner && cd jobrunner
$ go mod init github.com/go-quiz/go-daily-lib/jobrunner

安装jobrunner

$ go get -u github.com/bamzi/jobrunner

使用:

package main

import (
  "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 main

import (
  "fmt"
  "net/smtp"
  "time"

  "github.com/bamzi/jobrunner"
  "github.com/gin-gonic/gin"
  "github.com/jordan-wright/email"
)

type EmailJob struct {
  Name  string
  Email string
}

type User struct {
  Name  string `form:"name"`
  Email string `form:"email"`
}

func (j EmailJob) Run() {
  e := email.NewEmail()
  e.From = "[email protected]"
  e.To = []string{j.Email}
  e.Cc = []string{"[email protected]"}
  e.Subject = "Welcome To Awesome-Web"
  e.Text = []byte(fmt.Sprintf(`
  Hello, %s
  Welcome Back
  `, j.Name))

  err := e.Send("smtp.126.com:25", smtp.PlainAuth("", "[email protected]", "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 User
  if 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函数处理登录,传入nameemail,然后给该email发送邮件。email库的详细使用可以查看我之前的博文了解。

只需要在浏览器中输入http://localhost:8888/login?name=dj&[email protected],我的 QQ 邮箱就能收到邮件:

监控

jobrunner内置了一个监控模块,可以很方便地通过网页或者 API 获取当前的任务状态数据:

package main

import (
  "fmt"
  "html/template"
  "os"
  "time"

  "github.com/bamzi/jobrunner"
  "github.com/gin-gonic/gin"
)

type GreetingJob struct {
  Name string
}

func (g GreetingJob) Run() {
  fmt.Println("Hello,", g.Name)
}

type EmailJob struct {
  Email string
}

func (e EmailJob) Run() {
  fmt.Println("Send,", e.Email)
}

func main() {
  r := gin.Default()

  jobrunner.Start()
  jobrunner.Every(5*time.Second, GreetingJob{Name: "dj"})
  jobrunner.Every(10*time.Second, EmailJob{Email: "[email protected]"})

  r.GET("/jobrunner/json", JobJson)
  r.GET("/jobrunner/html", JobHtml)

  r.Run(":8888")
}

func JobJson(c *gin.Context) {
  c.JSON(200, jobrunner.StatusJson())
}

func JobHtml(c *gin.Context) {
  t, err := template.ParseFiles(os.Getenv("GOPATH") + "/src/github.com/bamzi/jobrunner/views/Status.html")
  if err != nil {
    c.JSON(400, "error")
  }
  t.Execute(c.Writer, jobrunner.StatusPage())
}

运行之后,在浏览器中输入http://localhost:8888/jobrunner/html查看任务状态:

这里显示任务名、任务 ID、状态、上次运行时间、下次运行时间以及处理延迟。

我们还可以通过http://localhost:8888/jobrunner/json获取原始 JSON 格式的数据自己处理:

总结

大家如果发现好玩、好用的 Go 语言库,欢迎到 Go 每日一库 GitHub 上提交 issue

参考

  1. jobrunner GitHub:https://github.com/bamzi/jobrunner
  2. Go 每日一库 GitHub:https://github.com/go-quiz/go-daily-lib

标签:github,Name,jobrunner,50,一库,time,Go,gin,com
From: https://www.cnblogs.com/arena/p/17735710.html

相关文章

  • Go每日一库之49:mapstructure
    简介mapstructure用于将通用的map[string]interface{}解码到对应的Go结构体中,或者执行相反的操作。很多时候,解析来自多种源头的数据流时,我们一般事先并不知道他们对应的具体类型。只有读取到一些字段之后才能做出判断。这时,我们可以先使用标准的encoding/json库将数据解码为map......
  • Go每日一库之70:termtables
    简介今天学个简单点的,termtables处理表格形式数据的输出。适用于随时随地的输出一些状态或统计数据,便于观察和调试。是一个很小巧的工具库。我在学习dateparse库时偶尔见遇到了这个库。快速使用本文代码使用GoModules。创建目录并初始化:$mkdirtermtables&&cdtermtable......
  • Go每日一库之69:resty
    简介resty是Go语言的一个HTTPclient库。resty功能强大,特性丰富。它支持几乎所有的HTTP方法(GET/POST/PUT/DELETE/OPTION/HEAD/PATCH等),并提供了简单易用的API。快速使用本文代码使用GoModules。创建目录并初始化:$mkdirresty&&cdresty$gomodinitgithub.com/......
  • golang-channel
    什么是channel管道channel是goroutine与goroutine之间通信的重要桥梁channel是一个通道,用于端到端的数据传输,这有点像我们平常使用的消息队列,只不过channel的发送方和接受方是 goroutine 对象,属于内存级别的通信。这里涉及到了goroutine概念,goroutine是轻量级的......
  • gom引擎微端架设教程
    在配置GOM微端之前呢,首先我们需要在服务器里面准备好1.传奇版本2.版本配套的补丁3.完整传奇客户端(推荐使用15到17周年的)4.微端程序。这些准备好,下面我们就可以直接架设了。首先呢需要把版本解压到D盘,然后把补丁解压到客户端里面,接着我们打开引擎包,引擎包里面有微端程序给程序放到桌......
  • GO基础环境搭建GoLand
    一、GO官方资料官网:https://golang.org/gosdk下载:https://golang.google.cn/dl/golang中文社区:https://studygolang.com/dl中文社区文档https://studygolang.com/pkgdoc二、开发环境配置1、GOSDK下载后,自行安装go语言开发需要使用gosdk,下载链接https://go.dev/dl/下载......
  • go go代码中调用python脚本
    目录gogo代码中调用python脚本写个简单的py脚本再写个go的脚本gogo代码中调用python脚本有的官方文档只提供了java和python的sdk,而我们需要用他们封装的服务,只能调用python或java的接口,接下来演示怎么调用python写个简单的py脚本importsysdefmain():args1=sys.ar......
  • Go每日一库之28:validator
    简介今天我们来介绍一个非常实用的库——validator。validator用于对数据进行校验。在Web开发中,对用户传过来的数据我们都需要进行严格校验,防止用户的恶意请求。例如日期格式,用户年龄,性别等必须是正常的值,不能随意设置。快速使用先安装:$gogetgopkg.in/go-playground/vali......
  • 在windows10上安装多个golang
    在windows10上安装多个golang原理下载不同go版本,然后重命名go可执行文件,然后配置环境变量,不同命令使用不同的版本。其实所有的开发环境都可以这么使用。比如python2,python3方法问的文心一言,哈哈哈哈哈哈总体方法如下,具体可以参考例子,例子更清楚。创建一个新的文件夹,用于......
  • Gorm接口
    packagemainimport("encoding/json""gorm.io/driver/mysql""gorm.io/gorm""net/http""strconv")//新闻结构体typeNewsstruct{Idint`json:"id"`Titlestring`json:"titl......