Работник ежедневной библиотеки Go

Go

Введение

Мы часто сталкиваемся с такими требованиями в веб-разработке: после выполнения операции нам нужно дать пользователям определенную форму уведомления. Например, пользователи могут отправлять электронные счета-фактуры по электронной почте после размещения заказа и отправлять информацию о номере поезда по SMS после покупки и оплаты билета онлайн. Однако такой запрос не обязательно должен быть очень своевременным.Если он будет обработан в процессе запроса, это повлияет на время ответа на запрос. Обычно мы используем асинхронные методы для выполнения таких задач.jobrunnerЭто одна из библиотек языка Go, используемая для выполнения асинхронных задач. благодаря мощномуcronбиблиотека, рекомбинацияjobrunnerмониторинг состояния задач,jobrunnerОчень прост в использовании.

быстрый в использовании

В этой статье используются модули Go.

Создайте каталог и инициализируйте:

$ mkdir jobrunner && cd jobrunner
$ go mod init github.com/darjun/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)
}

Мы создаем задачу, которая печатает приветственное сообщение каждые 5 секунд. создание и выполнение задачиcronТочно так же, подробности см. в моем предыдущем использовании.сообщение в блоге.

Уведомление,jobrunnerсначала нужноStart(), а затем добавьте задачу. Потому чтоStart()создан вMainCronобъект, добавление задачи сначалаpanic! ! !

Уведомлениеmainхвост функцииtime.Sleep(10 * time.Second), потому что вся программа завершается после завершения основной горутины,jobrunnerЗадачи в , не имеют шансов быть выполненными. плюсtime.SleepРезультат должен увидеть каждый, и он не будет выполняться в реальных условиях.

Интеграция с веб-фреймворками

jobrunnerЕго можно легко интегрировать с текущими распространенными веб-фреймворками, такими как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 = "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, %s
  Welcome 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 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Обработка входных данных функцией журналаnameа такжеemail, затем дайтеemailотправить письмо.emailПодробное использование библиотеки можно найти в моем предыдущемСообщение блогаК пониманию.

Просто введите в браузереhttp://localhost:8888/login?name=dj&email=935653229@qq.com, мой почтовый ящик 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: "935653229@qq.com"})

  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Посмотреть статус задачи:

Здесь отображаются имя задачи, идентификатор задачи, статус, время последнего выполнения, время следующего выполнения и задержка обработки.

Мы также можем пройтиhttp://localhost:8888/jobrunner/jsonПолучите данные в необработанном формате JSON и обработайте их самостоятельно:

Суммировать

Если вы найдете забавную и простую в использовании языковую библиотеку Go, добро пожаловать, чтобы отправить вопрос на Go Daily Library GitHub😄

Ссылаться на

  1. джобраннер GitHub:GitHub.com/ укажите имя/работу, например...
  2. Перейти на ежедневный репозиторий GitHub:GitHub.com/Darenjun/go-of…

я

мой блог:darjun.github.io

Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись WeChat [GoUpUp], учитесь вместе и добивайтесь прогресса вместе ~