You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

50 lines
1.8 KiB

package connectionmanager
import (
amqp "github.com/rabbitmq/amqp091-go"
)
// NotifyBlockedSafe safely wraps the (*amqp.Connection).NotifyBlocked method
func (connManager *ConnectionManager) NotifyBlockedSafe(
receiver chan amqp.Blocking,
) chan amqp.Blocking {
connManager.connectionMu.Lock()
defer connManager.connectionMu.Unlock()
// add receiver to connection manager.
connManager.publisherNotifyBlockingReceiversMu.Lock()
connManager.publisherNotifyBlockingReceivers = append(connManager.publisherNotifyBlockingReceivers, receiver)
connManager.publisherNotifyBlockingReceiversMu.Unlock()
if !connManager.universalNotifyBlockingReceiverUsed {
connManager.connection.NotifyBlocked(
connManager.universalNotifyBlockingReceiver,
)
connManager.universalNotifyBlockingReceiverUsed = true
}
return receiver
}
// readUniversalBlockReceiver reads on universal blocking receiver and broadcasts event to all blocking receivers of
// connection manager.
func (connManager *ConnectionManager) readUniversalBlockReceiver() {
for b := range connManager.universalNotifyBlockingReceiver {
connManager.publisherNotifyBlockingReceiversMu.RLock()
for _, br := range connManager.publisherNotifyBlockingReceivers {
br <- b
}
connManager.publisherNotifyBlockingReceiversMu.RUnlock()
}
}
func (connManager *ConnectionManager) RemovePublisherBlockingReceiver(receiver chan amqp.Blocking) {
connManager.publisherNotifyBlockingReceiversMu.Lock()
for i, br := range connManager.publisherNotifyBlockingReceivers {
if br == receiver {
connManager.publisherNotifyBlockingReceivers = append(connManager.publisherNotifyBlockingReceivers[:i], connManager.publisherNotifyBlockingReceivers[i+1:]...)
}
}
connManager.publisherNotifyBlockingReceiversMu.Unlock()
close(receiver)
}