You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
261 lines
5.5 KiB
261 lines
5.5 KiB
3 years ago
|
package daemon_test
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"sync/atomic"
|
||
|
"time"
|
||
|
|
||
|
"gitoa.ru/go-4devs/daemon"
|
||
|
)
|
||
|
|
||
|
var ErrJob = errors.New("some reason")
|
||
|
|
||
|
func ExampleManager() {
|
||
|
m := daemon.New()
|
||
|
j := daemon.NewJob(func(ctx context.Context) error {
|
||
|
// do some job
|
||
|
return daemon.StopJob(nil)
|
||
|
}, daemon.WithName("awesome job"))
|
||
|
|
||
|
m.Do(context.Background(), j,
|
||
|
// set frequency run job
|
||
|
daemon.WithFreq(time.Minute),
|
||
|
// set delay for first run job
|
||
|
daemon.WithDelay(time.Second),
|
||
|
// set handler if run job return err
|
||
|
daemon.WithHandleErr(func(err error) {
|
||
|
log.Println(err)
|
||
|
}),
|
||
|
)
|
||
|
m.Wait()
|
||
|
// Output:
|
||
|
}
|
||
|
|
||
|
func ExampleManager_withClose() {
|
||
|
m := daemon.New()
|
||
|
|
||
|
defer func() {
|
||
|
_ = m.Close()
|
||
|
}()
|
||
|
|
||
|
j := daemon.NewJob(func(ctx context.Context) error {
|
||
|
fmt.Println("do some job;")
|
||
|
return daemon.StopJob(nil)
|
||
|
}, daemon.WithName("awesome job"))
|
||
|
|
||
|
m.Do(context.Background(), j, daemon.WithFreq(time.Microsecond))
|
||
|
// some blocked process
|
||
|
time.Sleep(time.Second)
|
||
|
// Output: do some job;
|
||
|
}
|
||
|
|
||
|
func ExampleManager_withOptions() {
|
||
|
ctx := context.Background()
|
||
|
|
||
|
middlewareRun := func(ctx context.Context, next daemon.Run) error {
|
||
|
fmt.Println("do some before run all job;")
|
||
|
|
||
|
err := next(ctx)
|
||
|
|
||
|
fmt.Println("do some after run all job;")
|
||
|
|
||
|
return err
|
||
|
}
|
||
|
middlewareStop := func(ctx context.Context, next daemon.Run) error {
|
||
|
fmt.Println("do some before close all job;")
|
||
|
|
||
|
err := next(ctx)
|
||
|
|
||
|
fmt.Println("do some after close all job;")
|
||
|
|
||
|
return err
|
||
|
}
|
||
|
m := daemon.New(
|
||
|
daemon.WithRunMiddleware(middlewareRun),
|
||
|
daemon.WithStopMiddleware(middlewareStop),
|
||
|
daemon.WithHandleErr(func(err error) {
|
||
|
// do some if close return err
|
||
|
log.Println(err)
|
||
|
}),
|
||
|
)
|
||
|
|
||
|
j := daemon.NewJob(func(ctx context.Context) error {
|
||
|
fmt.Println("do some job;")
|
||
|
return daemon.StopJob(nil)
|
||
|
}, daemon.WithName("awesome job"))
|
||
|
j2 := daemon.NewJob(func(ctx context.Context) error {
|
||
|
fmt.Println("do some job2;")
|
||
|
return daemon.StopJob(nil)
|
||
|
}, daemon.WithName("awesome job2"))
|
||
|
|
||
|
m.Do(ctx, j, daemon.WithFreq(time.Minute), daemon.WithDelay(time.Second))
|
||
|
m.Do(ctx, j2, daemon.WithFreq(time.Nanosecond))
|
||
|
m.Wait()
|
||
|
// Output:
|
||
|
// do some before run all job;
|
||
|
// do some job2;
|
||
|
// do some after run all job;
|
||
|
// do some before close all job;
|
||
|
// do some after close all job;
|
||
|
// do some before run all job;
|
||
|
// do some job;
|
||
|
// do some after run all job;
|
||
|
// do some before close all job;
|
||
|
// do some after close all job;
|
||
|
}
|
||
|
|
||
|
func ExampleNewJob() {
|
||
|
ctx := context.Background()
|
||
|
m := daemon.New(func(j *daemon.Job) {
|
||
|
daemon.WithRunMiddleware(func(ctx context.Context, next daemon.Run) error {
|
||
|
fmt.Printf("running job: %s\n", j)
|
||
|
return daemon.StopJob(next(ctx))
|
||
|
})(j)
|
||
|
})
|
||
|
j := daemon.NewJob(func(ctx context.Context) error {
|
||
|
// do some
|
||
|
return nil
|
||
|
}, daemon.WithName("my awesome job"))
|
||
|
|
||
|
m.Do(ctx, j)
|
||
|
|
||
|
m.Wait()
|
||
|
// Output: running job: my awesome job
|
||
|
}
|
||
|
|
||
|
func ExampleNewJob_withClose() {
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
||
|
defer cancel()
|
||
|
|
||
|
m := daemon.New()
|
||
|
|
||
|
j := daemon.NewJob(func(ctx context.Context) error {
|
||
|
fmt.Println("do some long job;")
|
||
|
return daemon.StopJob(nil)
|
||
|
}, daemon.WithStop(func(ctx context.Context) error {
|
||
|
fmt.Println("do some close job;")
|
||
|
return nil
|
||
|
}))
|
||
|
|
||
|
m.Do(ctx, j)
|
||
|
|
||
|
m.Wait()
|
||
|
// Output:
|
||
|
// do some long job;
|
||
|
// do some close job;
|
||
|
}
|
||
|
|
||
|
func ExampleJob_withMiddleware() {
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
||
|
defer cancel()
|
||
|
|
||
|
m := daemon.New()
|
||
|
|
||
|
j := daemon.NewJob(
|
||
|
func(ctx context.Context) error {
|
||
|
fmt.Println("do some job;")
|
||
|
return daemon.StopJob(nil)
|
||
|
},
|
||
|
daemon.WithStop(func(ctx context.Context) error {
|
||
|
fmt.Println("do some close job;")
|
||
|
return nil
|
||
|
}),
|
||
|
daemon.WithRunMiddleware(func(ctx context.Context, next daemon.Run) error {
|
||
|
fmt.Println("do some before run func;")
|
||
|
err := next(ctx)
|
||
|
fmt.Println("do some after run func;")
|
||
|
return err
|
||
|
}),
|
||
|
daemon.WithStopMiddleware(func(ctx context.Context, next daemon.Run) error {
|
||
|
fmt.Println("do some before close func;")
|
||
|
err := next(ctx)
|
||
|
fmt.Println("do some after close func;")
|
||
|
return err
|
||
|
}),
|
||
|
)
|
||
|
|
||
|
m.Do(ctx, j)
|
||
|
|
||
|
m.Wait()
|
||
|
// Output:
|
||
|
// do some before run func;
|
||
|
// do some job;
|
||
|
// do some after run func;
|
||
|
// do some before close func;
|
||
|
// do some close job;
|
||
|
// do some after close func;
|
||
|
}
|
||
|
|
||
|
func ExampleJob_option() {
|
||
|
var cnt int32
|
||
|
|
||
|
ctx, cancel := context.WithTimeout(context.TODO(), time.Second)
|
||
|
defer cancel()
|
||
|
|
||
|
m := daemon.New()
|
||
|
j := daemon.NewJob(func(ctx context.Context) error {
|
||
|
if cnt == 2 {
|
||
|
return daemon.StopJob(nil)
|
||
|
}
|
||
|
atomic.AddInt32(&cnt, 1)
|
||
|
fmt.Println("do some")
|
||
|
return nil
|
||
|
},
|
||
|
// set freq run job
|
||
|
daemon.WithFreq(time.Microsecond),
|
||
|
// set delay to start job
|
||
|
daemon.WithDelay(time.Nanosecond),
|
||
|
)
|
||
|
|
||
|
m.Do(ctx, j)
|
||
|
m.Wait()
|
||
|
// Output:
|
||
|
//do some
|
||
|
//do some
|
||
|
}
|
||
|
|
||
|
func ExampleNewJob_stop() {
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
||
|
defer cancel()
|
||
|
|
||
|
m := daemon.New()
|
||
|
|
||
|
var i int32
|
||
|
|
||
|
j := daemon.NewJob(func(ctx context.Context) error {
|
||
|
atomic.AddInt32(&i, 1)
|
||
|
fmt.Print("do some:", i, " ")
|
||
|
return daemon.StopJob(ErrJob)
|
||
|
})
|
||
|
|
||
|
m.Do(ctx, j)
|
||
|
|
||
|
m.Wait()
|
||
|
// Output: do some:1
|
||
|
}
|
||
|
|
||
|
func ExampleJob_delay() {
|
||
|
var i int32
|
||
|
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
||
|
defer cancel()
|
||
|
|
||
|
m := daemon.New()
|
||
|
j := daemon.NewJob(func(ctx context.Context) error {
|
||
|
if i == 3 {
|
||
|
return daemon.StopJob(nil)
|
||
|
}
|
||
|
atomic.AddInt32(&i, 1)
|
||
|
fmt.Print("do some:", i, " ")
|
||
|
return daemon.DelayJob(time.Second/2, ErrJob)
|
||
|
})
|
||
|
|
||
|
m.Do(ctx, j)
|
||
|
|
||
|
m.Wait()
|
||
|
// Output: do some:1 do some:2 do some:3
|
||
|
}
|