Categorygithub.com/s-larionov/process-manager
repositorypackage
0.0.1
Repository: https://github.com/s-larionov/process-manager.git
Documentation: pkg.go.dev

# README

Process Manager

License unit-tests

Installation

go get -u github.com/s-larionov/process-manager

Example

package main

import (
	"context"
	"net/http"
	"os"
	"os/signal"
	"syscall"

	"github.com/gorilla/mux"
	"github.com/prometheus/client_golang/prometheus/promhttp"

	"github.com/s-larionov/process-manager"
)


func main() {
	manager := process.NewManager()

	// Create a callback worker
	manager.AddWorker(process.NewCallbackWorker("test", func(ctx context.Context) error {
		select {
		case <-ctx.Done():
			return ctx.Err()
		}
	}))

	// Create a callback worker with retries
	opt := process.RetryOnErrorOpt{
		Timeout:     time.Second, // When it is omitted manager will try to run it immediately
		MaxAttempts: 10,          // When this param is missed manager will try restart in infinity loop
	}
	manager.AddWorker(process.NewCallbackWorker("test with error", func(ctx context.Context) error {
		for {
			select {
			case <-ctx.Done():
				return ctx.Err()
			case <-time.After(time.Millisecond):
				return errors.New("test error")
			}
		}
	}, opt))

	// Create an example of server worker for prometheus
	handler := mux.NewRouter()
	handler.Handle("/metrics", promhttp.Handler())
	server := &http.Server{
		Addr:    ":2112",
		Handler: handler,
	}
	manager.AddWorker(process.NewServerWorker("prometheus", server))

	manager.StartAll()

	WaitShutdown(manager)
}

func WaitShutdown(manager *process.Manager) {
	go func(manager *process.Manager) {
		sigChan := make(chan os.Signal, 1)
		signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

		<-sigChan

		manager.StopAll()
	}(manager)

	manager.AwaitAll()
}