rabbitmq-amqp-go-client/rabbitmq_amqp/life_cycle.go

76 lines
1.1 KiB
Go
Raw Normal View History

package rabbitmq_amqp
import (
"fmt"
"sync"
)
const (
Open = iota
Reconnecting = iota
Closing = iota
Closed = iota
)
func statusToString(status int) string {
switch status {
case Open:
return "Open"
case Reconnecting:
return "Reconnecting"
case Closing:
return "Closing"
case Closed:
return "Closed"
}
return "Unknown"
}
type StatusChanged struct {
From int
To int
}
func (s StatusChanged) String() string {
return fmt.Sprintf("From: %s, To: %s", statusToString(s.From), statusToString(s.To))
}
type LifeCycle struct {
status int
chStatusChanged chan *StatusChanged
mutex *sync.Mutex
}
func NewLifeCycle() *LifeCycle {
return &LifeCycle{
status: Closed,
mutex: &sync.Mutex{},
}
}
func (l *LifeCycle) Status() int {
l.mutex.Lock()
defer l.mutex.Unlock()
return l.status
}
func (l *LifeCycle) SetStatus(value int) {
l.mutex.Lock()
defer l.mutex.Unlock()
if l.status == value {
return
}
oldState := l.status
l.status = value
if l.chStatusChanged == nil {
return
}
l.chStatusChanged <- &StatusChanged{
From: oldState,
To: value,
}
}