76 lines
1.1 KiB
Go
76 lines
1.1 KiB
Go
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,
|
|
}
|
|
}
|