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.

260 lines
5.5 KiB

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
}