2025-02-17 21:04:13 +08:00
|
|
|
package rabbitmqamqp
|
2024-09-10 17:26:46 +08:00
|
|
|
|
2024-11-15 15:37:28 +08:00
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"sync"
|
|
|
|
|
)
|
2024-09-10 17:26:46 +08:00
|
|
|
|
2025-01-16 22:26:12 +08:00
|
|
|
type LifeCycleState interface {
|
|
|
|
|
getState() int
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type StateOpen struct {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (o *StateOpen) getState() int {
|
|
|
|
|
return open
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type StateReconnecting struct {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *StateReconnecting) getState() int {
|
|
|
|
|
return reconnecting
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type StateClosing struct {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *StateClosing) getState() int {
|
|
|
|
|
return closing
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type StateClosed struct {
|
2025-02-07 18:00:14 +08:00
|
|
|
error error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *StateClosed) GetError() error {
|
|
|
|
|
return c.error
|
2025-01-16 22:26:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *StateClosed) getState() int {
|
|
|
|
|
return closed
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-10 17:26:46 +08:00
|
|
|
const (
|
2025-01-16 22:26:12 +08:00
|
|
|
open = iota
|
|
|
|
|
reconnecting = iota
|
|
|
|
|
closing = iota
|
|
|
|
|
closed = iota
|
2024-09-10 17:26:46 +08:00
|
|
|
)
|
|
|
|
|
|
2025-01-16 22:26:12 +08:00
|
|
|
func statusToString(status LifeCycleState) string {
|
|
|
|
|
switch status.getState() {
|
|
|
|
|
case open:
|
|
|
|
|
return "open"
|
|
|
|
|
case reconnecting:
|
|
|
|
|
return "reconnecting"
|
|
|
|
|
case closing:
|
|
|
|
|
return "closing"
|
|
|
|
|
case closed:
|
|
|
|
|
return "closed"
|
2024-11-15 15:37:28 +08:00
|
|
|
}
|
2025-01-16 22:26:12 +08:00
|
|
|
return "unknown"
|
2024-11-15 15:37:28 +08:00
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-16 22:26:12 +08:00
|
|
|
type StateChanged struct {
|
|
|
|
|
From LifeCycleState
|
|
|
|
|
To LifeCycleState
|
2024-09-10 17:26:46 +08:00
|
|
|
}
|
|
|
|
|
|
2025-01-16 22:26:12 +08:00
|
|
|
func (s StateChanged) String() string {
|
2025-02-07 18:00:14 +08:00
|
|
|
switch s.From.(type) {
|
|
|
|
|
case *StateClosed:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch s.To.(type) {
|
|
|
|
|
case *StateClosed:
|
|
|
|
|
return fmt.Sprintf("From: %s, To: %s, Error: %s", statusToString(s.From), statusToString(s.To), s.To.(*StateClosed).error)
|
|
|
|
|
|
|
|
|
|
}
|
2024-11-15 15:37:28 +08:00
|
|
|
return fmt.Sprintf("From: %s, To: %s", statusToString(s.From), statusToString(s.To))
|
2025-02-07 18:00:14 +08:00
|
|
|
|
2024-11-15 15:37:28 +08:00
|
|
|
}
|
|
|
|
|
|
2024-09-10 17:26:46 +08:00
|
|
|
type LifeCycle struct {
|
2025-01-16 22:26:12 +08:00
|
|
|
state LifeCycleState
|
|
|
|
|
chStatusChanged chan *StateChanged
|
2024-09-10 17:26:46 +08:00
|
|
|
mutex *sync.Mutex
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewLifeCycle() *LifeCycle {
|
|
|
|
|
return &LifeCycle{
|
2025-01-16 22:26:12 +08:00
|
|
|
state: &StateClosed{},
|
|
|
|
|
mutex: &sync.Mutex{},
|
2024-09-10 17:26:46 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-16 22:26:12 +08:00
|
|
|
func (l *LifeCycle) State() LifeCycleState {
|
2024-09-10 17:26:46 +08:00
|
|
|
l.mutex.Lock()
|
|
|
|
|
defer l.mutex.Unlock()
|
2025-01-16 22:26:12 +08:00
|
|
|
return l.state
|
2024-09-10 17:26:46 +08:00
|
|
|
}
|
|
|
|
|
|
2025-01-16 22:26:12 +08:00
|
|
|
func (l *LifeCycle) SetState(value LifeCycleState) {
|
2024-09-10 17:26:46 +08:00
|
|
|
l.mutex.Lock()
|
|
|
|
|
defer l.mutex.Unlock()
|
2025-01-16 22:26:12 +08:00
|
|
|
if l.state == value {
|
2024-09-10 17:26:46 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-16 22:26:12 +08:00
|
|
|
oldState := l.state
|
|
|
|
|
l.state = value
|
2024-09-10 17:26:46 +08:00
|
|
|
|
|
|
|
|
if l.chStatusChanged == nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
2025-02-07 18:00:14 +08:00
|
|
|
|
2025-01-16 22:26:12 +08:00
|
|
|
l.chStatusChanged <- &StateChanged{
|
2024-09-10 17:26:46 +08:00
|
|
|
From: oldState,
|
|
|
|
|
To: value,
|
|
|
|
|
}
|
|
|
|
|
}
|