Введение
Мы часто сталкиваемся с такими требованиями в веб-разработке: после выполнения операции нам нужно дать пользователям определенную форму уведомления. Например, пользователи могут отправлять электронные счета-фактуры по электронной почте после размещения заказа и отправлять информацию о номере поезда по 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😄
Ссылаться на
- джобраннер GitHub:GitHub.com/ укажите имя/работу, например...
- Перейти на ежедневный репозиторий GitHub:GitHub.com/Darenjun/go-of…
я
мой блог:darjun.github.io
Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись WeChat [GoUpUp], учитесь вместе и добивайтесь прогресса вместе ~