background runner
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
package backgroundtask_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"queryorchestration/internal/backgroundtask"
|
||||
)
|
||||
|
||||
func ExampleRunner_basic() {
|
||||
// Create a simple configuration
|
||||
type Config struct {
|
||||
Counter atomic.Int64
|
||||
}
|
||||
appConfig := &Config{}
|
||||
|
||||
// Create configuration map
|
||||
config := map[string]any{
|
||||
"appConfig": appConfig,
|
||||
}
|
||||
|
||||
// Create a work function that increments the counter
|
||||
workFunc := func(ctx context.Context, logger *slog.Logger, cfg map[string]any) error {
|
||||
appCfgVal, ok := cfg["appConfig"]
|
||||
if !ok {
|
||||
return fmt.Errorf("appConfig not found")
|
||||
}
|
||||
c, ok := appCfgVal.(*Config)
|
||||
if !ok {
|
||||
return fmt.Errorf("invalid config type")
|
||||
}
|
||||
count := c.Counter.Add(1)
|
||||
logger.Info("work executed", "count", count)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Initialize the runner with a 100ms interval for quick demonstration
|
||||
runner, err := backgroundtask.Initialize(
|
||||
config,
|
||||
slog.Default(),
|
||||
workFunc,
|
||||
backgroundtask.WithInterval(100*time.Millisecond),
|
||||
)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Start the runner
|
||||
if err := runner.Run(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Let it run for a short time
|
||||
time.Sleep(250 * time.Millisecond)
|
||||
|
||||
// Signal immediate work
|
||||
if err := runner.Signal(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Wait a bit more
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
|
||||
// Shutdown gracefully
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
if err := runner.Shutdown(ctx); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Check stats
|
||||
stats := runner.Stats()
|
||||
fmt.Printf("Work cycles completed: %d\n", stats.WorkCycles())
|
||||
fmt.Printf("Counter value: %d\n", appConfig.Counter.Load())
|
||||
|
||||
// Can also pretty-print all stats (commented out for example test):
|
||||
// stats.Print(os.Stdout)
|
||||
|
||||
// Output:
|
||||
// Work cycles completed: 4
|
||||
// Counter value: 4
|
||||
}
|
||||
|
||||
func ExampleRunner_withTestConfig() {
|
||||
// Use the provided test configuration
|
||||
config := backgroundtask.NewTestConfigMap()
|
||||
testConfig, _ := backgroundtask.GetTestConfig(config)
|
||||
testConfig.WorkDuration = 50 * time.Millisecond
|
||||
|
||||
// Initialize with test work function
|
||||
runner, err := backgroundtask.Initialize(
|
||||
config,
|
||||
slog.Default(),
|
||||
backgroundtask.TestWorkFunc,
|
||||
backgroundtask.WithInterval(100*time.Millisecond),
|
||||
)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Start the runner
|
||||
if err := runner.Run(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Wait for some work cycles
|
||||
if !backgroundtask.WaitForWorkCycles(runner, 2, 300*time.Millisecond) {
|
||||
panic("expected at least 2 work cycles")
|
||||
}
|
||||
|
||||
// Shutdown
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
if err := runner.Shutdown(ctx); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Printf("Test work executed %d times\n", testConfig.Counter.Load())
|
||||
// Output will show at least 2 executions
|
||||
}
|
||||
Reference in New Issue
Block a user