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

getty_remoting.go 3.6 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package getty
  2. import (
  3. "sync"
  4. "time"
  5. )
  6. import (
  7. getty "github.com/apache/dubbo-getty"
  8. gxtime "github.com/dubbogo/gost/time"
  9. "github.com/pkg/errors"
  10. )
  11. import (
  12. "github.com/seata/seata-go/pkg/common/log"
  13. "github.com/seata/seata-go/pkg/protocol/message"
  14. )
  15. const (
  16. RPC_REQUEST_TIMEOUT = 30 * time.Second
  17. )
  18. var (
  19. gettyRemoting *GettyRemoting
  20. onceGettyRemoting = &sync.Once{}
  21. )
  22. type GettyRemoting struct {
  23. futures *sync.Map
  24. mergeMsgMap *sync.Map
  25. }
  26. func GetGettyRemotingInstance() *GettyRemoting {
  27. if gettyRemoting == nil {
  28. onceGettyRemoting.Do(func() {
  29. gettyRemoting = &GettyRemoting{
  30. futures: &sync.Map{},
  31. mergeMsgMap: &sync.Map{},
  32. }
  33. })
  34. }
  35. return gettyRemoting
  36. }
  37. func (client *GettyRemoting) SendSync(msg message.RpcMessage) (interface{}, error) {
  38. ss := sessionManager.AcquireGettySession()
  39. return client.sendAsync(ss, msg, RPC_REQUEST_TIMEOUT)
  40. }
  41. func (client *GettyRemoting) SendSyncWithTimeout(msg message.RpcMessage, timeout time.Duration) (interface{}, error) {
  42. ss := sessionManager.AcquireGettySession()
  43. return client.sendAsync(ss, msg, timeout)
  44. }
  45. func (client *GettyRemoting) SendASync(msg message.RpcMessage) error {
  46. ss := sessionManager.AcquireGettySession()
  47. _, err := client.sendAsync(ss, msg, 0*time.Second)
  48. return err
  49. }
  50. func (client *GettyRemoting) sendAsync(session getty.Session, msg message.RpcMessage, timeout time.Duration) (interface{}, error) {
  51. var err error
  52. if session == nil || session.IsClosed() {
  53. log.Warn("sendAsyncRequestWithResponse nothing, caused by null channel.")
  54. }
  55. resp := message.NewMessageFuture(msg)
  56. client.futures.Store(msg.ID, resp)
  57. _, _, err = session.WritePkg(msg, time.Duration(0))
  58. if err != nil {
  59. client.futures.Delete(msg.ID)
  60. log.Errorf("send message: %#v, session: %s", msg, session.Stat())
  61. return nil, err
  62. }
  63. log.Debugf("send message: %#v, session: %s", msg, session.Stat())
  64. actualTimeOut := timeout
  65. if timeout <= time.Duration(0) {
  66. // todo timeoue use config
  67. actualTimeOut = time.Duration(200)
  68. }
  69. wait := func() (interface{}, error) {
  70. select {
  71. case <-gxtime.GetDefaultTimerWheel().After(actualTimeOut):
  72. client.futures.Delete(msg.ID)
  73. if session != nil {
  74. return nil, errors.Errorf("wait response timeout, ip: %s, request: %#v", session.RemoteAddr(), msg)
  75. } else {
  76. return nil, errors.Errorf("wait response timeout and session is nil, request: %#v", msg)
  77. }
  78. case <-resp.Done:
  79. err = resp.Err
  80. return resp.Response, err
  81. }
  82. }
  83. if timeout > time.Duration(0) {
  84. return wait()
  85. } else {
  86. go wait()
  87. }
  88. return nil, err
  89. }
  90. func (client *GettyRemoting) GetMessageFuture(msgID int32) *message.MessageFuture {
  91. if msg, ok := client.futures.Load(msgID); ok {
  92. return msg.(*message.MessageFuture)
  93. }
  94. return nil
  95. }
  96. func (client *GettyRemoting) RemoveMessageFuture(msgID int32) {
  97. client.futures.Delete(msgID)
  98. }
  99. func (client *GettyRemoting) RemoveMergedMessageFuture(msgID int32) {
  100. client.mergeMsgMap.Delete(msgID)
  101. }
  102. func (client *GettyRemoting) GetMergedMessage(msgID int32) *message.MergedWarpMessage {
  103. if msg, ok := client.mergeMsgMap.Load(msgID); ok {
  104. return msg.(*message.MergedWarpMessage)
  105. }
  106. return nil
  107. }
  108. func (client *GettyRemoting) NotifyRpcMessageResponse(rpcMessage message.RpcMessage) {
  109. messageFuture := client.GetMessageFuture(rpcMessage.ID)
  110. if messageFuture != nil {
  111. messageFuture.Response = rpcMessage.Body
  112. // todo add messageFuture.Err
  113. //messageFuture.Err = rpcMessage.Err
  114. messageFuture.Done <- true
  115. //client.msgFutures.Delete(rpcMessage.RequestID)
  116. } else {
  117. log.Infof("msg: {} is not found in msgFutures.", rpcMessage.ID)
  118. }
  119. }

Go Implementation For Seata