rabbitmq-amqp-go-client/pkg/rabbitmq_amqp/amqp_environment.go

68 lines
1.9 KiB
Go

package rabbitmq_amqp
import (
"context"
"fmt"
"sync"
)
type Environment struct {
connections sync.Map
addresses []string
connOptions *AmqpConnOptions
}
func NewEnvironment(addresses []string, connOptions *AmqpConnOptions) *Environment {
return &Environment{
connections: sync.Map{},
addresses: addresses,
connOptions: connOptions,
}
}
// NewConnection get a new connection from the environment.
// If the connection id is provided, it will be used as the connection id.
// If the connection id is not provided, a new connection id will be generated.
// The connection id is unique in the environment.
// The Environment will keep track of the connection and close it when the environment is closed.
func (e *Environment) NewConnection(ctx context.Context, args ...string) (*AmqpConnection, error) {
if len(args) > 0 && len(args[0]) > 0 {
// check if connection already exists
if _, ok := e.connections.Load(args[0]); ok {
return nil, fmt.Errorf("connection with id %s already exists", args[0])
}
}
connection, err := Dial(ctx, e.addresses, e.connOptions, args...)
if err != nil {
return nil, err
}
e.connections.Store(connection.Id(), connection)
connection.refMap = &e.connections
return connection, nil
}
// Connections gets the active connections in the environment
func (e *Environment) Connections() []*AmqpConnection {
connections := make([]*AmqpConnection, 0)
e.connections.Range(func(key, value interface{}) bool {
connections = append(connections, value.(*AmqpConnection))
return true
})
return connections
}
// CloseConnections closes all the connections in the environment with all the publishers and consumers.
func (e *Environment) CloseConnections(ctx context.Context) error {
var err error
e.connections.Range(func(key, value any) bool {
connection := value.(*AmqpConnection)
if cerr := connection.Close(ctx); cerr != nil {
err = cerr
}
return true
})
return err
}