clientmanager.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package mon
  2. import (
  3. "context"
  4. "io"
  5. "github.com/wuntsong-org/go-zero-plus/core/syncx"
  6. "go.mongodb.org/mongo-driver/mongo"
  7. mopt "go.mongodb.org/mongo-driver/mongo/options"
  8. )
  9. var clientManager = syncx.NewResourceManager()
  10. // ClosableClient wraps *mongo.Client and provides a Close method.
  11. type ClosableClient struct {
  12. *mongo.Client
  13. }
  14. // Close disconnects the underlying *mongo.Client.
  15. func (cs *ClosableClient) Close() error {
  16. return cs.Client.Disconnect(context.Background())
  17. }
  18. // Inject injects a *mongo.Client into the client manager.
  19. // Typically, this is used to inject a *mongo.Client for test purpose.
  20. func Inject(key string, client *mongo.Client) {
  21. clientManager.Inject(key, &ClosableClient{client})
  22. }
  23. func getClient(url string, opts ...Option) (*mongo.Client, error) {
  24. val, err := clientManager.GetResource(url, func() (io.Closer, error) {
  25. o := mopt.Client().ApplyURI(url)
  26. opts = append([]Option{defaultTimeoutOption()}, opts...)
  27. for _, opt := range opts {
  28. opt(o)
  29. }
  30. cli, err := mongo.Connect(context.Background(), o)
  31. if err != nil {
  32. return nil, err
  33. }
  34. err = cli.Ping(context.Background(), nil)
  35. if err != nil {
  36. return nil, err
  37. }
  38. concurrentSess := &ClosableClient{
  39. Client: cli,
  40. }
  41. return concurrentSess, nil
  42. })
  43. if err != nil {
  44. return nil, err
  45. }
  46. return val.(*ClosableClient).Client, nil
  47. }