diff --git a/pulsar/client_impl.go b/pulsar/client_impl.go index c283f5a827..801eab3f28 100644 --- a/pulsar/client_impl.go +++ b/pulsar/client_impl.go @@ -20,6 +20,7 @@ package pulsar import ( "fmt" "net/url" + "sync" "time" "github.com/apache/pulsar-client-go/pulsar/auth" @@ -47,6 +48,7 @@ type client struct { metrics *internal.Metrics tcClient *transactionCoordinatorClient memLimit internal.MemoryLimitController + closeOnce sync.Once log log.Logger } @@ -266,7 +268,9 @@ func (c *client) TopicPartitions(topic string) ([]string, error) { } func (c *client) Close() { - c.handlers.Close() - c.cnxPool.Close() - c.lookupService.Close() + c.closeOnce.Do(func() { + c.handlers.Close() + c.cnxPool.Close() + c.lookupService.Close() + }) } diff --git a/pulsar/client_impl_test.go b/pulsar/client_impl_test.go index bb28371f20..78dc1cae68 100644 --- a/pulsar/client_impl_test.go +++ b/pulsar/client_impl_test.go @@ -1238,3 +1238,10 @@ func TestAutoCloseIdleConnection(t *testing.T) { cli.Close() } + +func TestMultipleCloseClient(t *testing.T) { + client, err := NewClient(ClientOptions{URL: serviceURL}) + assert.Nil(t, err) + client.Close() + client.Close() +}