Rabbitmq pubsub add client name (#2933)
Signed-off-by: zhangchao <zchao9100@gmail.com> Co-authored-by: Bernd Verst <github@bernd.dev>
This commit is contained in:
		
							parent
							
								
									7dbfd40327
								
							
						
					
					
						commit
						0c2ce324b2
					
				| 
						 | 
				
			
			@ -46,6 +46,8 @@ type rabbitmqMetadata struct {
 | 
			
		|||
	MaxLen               int64                  `mapstructure:"maxLen"`
 | 
			
		||||
	MaxLenBytes          int64                  `mapstructure:"maxLenBytes"`
 | 
			
		||||
	ExchangeKind         string                 `mapstructure:"exchangeKind"`
 | 
			
		||||
	ClientName           string                 `mapstructure:"clientName"`
 | 
			
		||||
	HeartBeat            time.Duration          `mapstructure:"heartBeat"`
 | 
			
		||||
	PublisherConfirm     bool                   `mapstructure:"publisherConfirm"`
 | 
			
		||||
	SaslExternal         bool                   `mapstructure:"saslExternal"`
 | 
			
		||||
	Concurrency          pubsub.ConcurrencyMode `mapstructure:"concurrency"`
 | 
			
		||||
| 
						 | 
				
			
			@ -77,6 +79,8 @@ const (
 | 
			
		|||
	metadataPublisherConfirmKey     = "publisherConfirm"
 | 
			
		||||
	metadataSaslExternal            = "saslExternal"
 | 
			
		||||
	metadataMaxPriority             = "maxPriority"
 | 
			
		||||
	metadataClientNameKey           = "clientName"
 | 
			
		||||
	metadataHeartBeatKey            = "heartBeat"
 | 
			
		||||
	metadataQueueNameKey            = "queueName"
 | 
			
		||||
 | 
			
		||||
	defaultReconnectWaitSeconds = 3
 | 
			
		||||
| 
						 | 
				
			
			@ -97,6 +101,7 @@ func createMetadata(pubSubMetadata pubsub.Metadata, log logger.Logger) (*rabbitm
 | 
			
		|||
		ExchangeKind:     fanoutExchangeKind,
 | 
			
		||||
		PublisherConfirm: false,
 | 
			
		||||
		SaslExternal:     false,
 | 
			
		||||
		HeartBeat:        defaultHeartbeat,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// upgrade metadata
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@ import (
 | 
			
		|||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	amqp "github.com/rabbitmq/amqp091-go"
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
| 
						 | 
				
			
			@ -141,6 +142,42 @@ func TestCreateMetadata(t *testing.T) {
 | 
			
		|||
		assert.Equal(t, uint8(2), m.DeliveryMode)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	t.Run("client name is set", func(t *testing.T) {
 | 
			
		||||
		fakeProperties := getFakeProperties()
 | 
			
		||||
 | 
			
		||||
		fakeMetaData := pubsub.Metadata{
 | 
			
		||||
			Base: mdata.Base{Properties: fakeProperties},
 | 
			
		||||
		}
 | 
			
		||||
		fakeMetaData.Properties[metadataClientNameKey] = "fakeclientname"
 | 
			
		||||
 | 
			
		||||
		// act
 | 
			
		||||
		m, err := createMetadata(fakeMetaData, log)
 | 
			
		||||
 | 
			
		||||
		// assert
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		assert.Equal(t, fakeProperties[metadataHostnameKey], m.Hostname)
 | 
			
		||||
		assert.Equal(t, fakeProperties[metadataConsumerIDKey], m.ConsumerID)
 | 
			
		||||
		assert.Equal(t, "fakeclientname", m.ClientName)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	t.Run("heart beat is set", func(t *testing.T) {
 | 
			
		||||
		fakeProperties := getFakeProperties()
 | 
			
		||||
 | 
			
		||||
		fakeMetaData := pubsub.Metadata{
 | 
			
		||||
			Base: mdata.Base{Properties: fakeProperties},
 | 
			
		||||
		}
 | 
			
		||||
		fakeMetaData.Properties[metadataHeartBeatKey] = "1m"
 | 
			
		||||
 | 
			
		||||
		// act
 | 
			
		||||
		m, err := createMetadata(fakeMetaData, log)
 | 
			
		||||
 | 
			
		||||
		// assert
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		assert.Equal(t, fakeProperties[metadataHostnameKey], m.Hostname)
 | 
			
		||||
		assert.Equal(t, fakeProperties[metadataConsumerIDKey], m.ConsumerID)
 | 
			
		||||
		assert.Equal(t, time.Minute, m.HeartBeat)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	t.Run("disable durable mode, disable delete when unused", func(t *testing.T) {
 | 
			
		||||
		fakeProperties := getFakeProperties()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,12 +45,15 @@ const (
 | 
			
		|||
 | 
			
		||||
	publishMaxRetries       = 3
 | 
			
		||||
	publishRetryWaitSeconds = 2
 | 
			
		||||
	defaultHeartbeat        = 10 * time.Second
 | 
			
		||||
	defaultLocale           = "en_US"
 | 
			
		||||
 | 
			
		||||
	argQueueMode              = "x-queue-mode"
 | 
			
		||||
	argMaxLength              = "x-max-length"
 | 
			
		||||
	argMaxLengthBytes         = "x-max-length-bytes"
 | 
			
		||||
	argDeadLetterExchange     = "x-dead-letter-exchange"
 | 
			
		||||
	argMaxPriority            = "x-max-priority"
 | 
			
		||||
	propertyClientName        = "connection_name"
 | 
			
		||||
	queueModeLazy             = "lazy"
 | 
			
		||||
	reqMetadataRoutingKey     = "routingKey"
 | 
			
		||||
	reqMetadataQueueTypeKey   = "queueType" // at the moment, only supporting classic and quorum queues
 | 
			
		||||
| 
						 | 
				
			
			@ -67,7 +70,7 @@ type rabbitMQ struct {
 | 
			
		|||
	metadata          *rabbitmqMetadata
 | 
			
		||||
	declaredExchanges map[string]bool
 | 
			
		||||
 | 
			
		||||
	connectionDial func(protocol, uri string, tlsCfg *tls.Config, externalSasl bool) (rabbitMQConnectionBroker, rabbitMQChannelBroker, error)
 | 
			
		||||
	connectionDial func(protocol, uri, clientName string, heartBeat time.Duration, tlsCfg *tls.Config, externalSasl bool) (rabbitMQConnectionBroker, rabbitMQChannelBroker, error)
 | 
			
		||||
	closeCh        chan struct{}
 | 
			
		||||
	closed         atomic.Bool
 | 
			
		||||
	wg             sync.WaitGroup
 | 
			
		||||
| 
						 | 
				
			
			@ -108,22 +111,27 @@ func NewRabbitMQ(logger logger.Logger) pubsub.PubSub {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func dial(protocol, uri string, tlsCfg *tls.Config, externalSasl bool) (rabbitMQConnectionBroker, rabbitMQChannelBroker, error) {
 | 
			
		||||
func dial(protocol, uri, clientName string, heartBeat time.Duration, tlsCfg *tls.Config, externalSasl bool) (rabbitMQConnectionBroker, rabbitMQChannelBroker, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		conn *amqp.Connection
 | 
			
		||||
		ch   *amqp.Channel
 | 
			
		||||
		err  error
 | 
			
		||||
		cfg  = amqp.Config{Heartbeat: heartBeat, Locale: defaultLocale} // use default locale of amqp091-go
 | 
			
		||||
	)
 | 
			
		||||
	if len(clientName) > 0 {
 | 
			
		||||
		cfg.Properties = map[string]interface{}{
 | 
			
		||||
			propertyClientName: clientName,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if protocol == protocolAMQPS {
 | 
			
		||||
		cfg.TLSClientConfig = tlsCfg
 | 
			
		||||
		if externalSasl {
 | 
			
		||||
			conn, err = amqp.DialTLS_ExternalAuth(uri, tlsCfg)
 | 
			
		||||
		} else {
 | 
			
		||||
			conn, err = amqp.DialTLS(uri, tlsCfg)
 | 
			
		||||
			cfg.SASL = []amqp.Authentication{&amqp.ExternalAuth{}}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		conn, err = amqp.Dial(uri)
 | 
			
		||||
	}
 | 
			
		||||
	conn, err = amqp.DialConfig(uri, cfg)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -180,7 +188,7 @@ func (r *rabbitMQ) reconnect(connectionCount int) error {
 | 
			
		|||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	r.connection, r.channel, err = r.connectionDial(r.metadata.internalProtocol, r.metadata.connectionURI(), tlsCfg, r.metadata.SaslExternal)
 | 
			
		||||
	r.connection, r.channel, err = r.connectionDial(r.metadata.internalProtocol, r.metadata.connectionURI(), r.metadata.ClientName, r.metadata.HeartBeat, tlsCfg, r.metadata.SaslExternal)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		r.reset()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ func newRabbitMQTest(broker *rabbitMQInMemoryBroker) *rabbitMQ {
 | 
			
		|||
	return &rabbitMQ{
 | 
			
		||||
		declaredExchanges: make(map[string]bool),
 | 
			
		||||
		logger:            logger.NewLogger("test"),
 | 
			
		||||
		connectionDial: func(protocol, uri string, tlsCfg *tls.Config, externalSasl bool) (rabbitMQConnectionBroker, rabbitMQChannelBroker, error) {
 | 
			
		||||
		connectionDial: func(protocol, uri, clientName string, heartBeat time.Duration, tlsCfg *tls.Config, externalSasl bool) (rabbitMQConnectionBroker, rabbitMQChannelBroker, error) {
 | 
			
		||||
			broker.connectCount.Add(1)
 | 
			
		||||
			return broker, broker, nil
 | 
			
		||||
		},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue