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.

rpc_remoting_client.go 2.6 kB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package rpc11
  2. import (
  3. "time"
  4. )
  5. import (
  6. getty "github.com/apache/dubbo-getty"
  7. "github.com/pkg/errors"
  8. "go.uber.org/atomic"
  9. )
  10. import (
  11. "github.com/seata/seata-go/pkg/protocol"
  12. "github.com/seata/seata-go/pkg/protocol/codec"
  13. log "github.com/seata/seata-go/pkg/util/log"
  14. )
  15. type ClientEventHandler struct {
  16. }
  17. func NewClientEventHandler() *ClientEventHandler {
  18. return &ClientEventHandler{}
  19. }
  20. func (h *ClientEventHandler) OnOpen(session getty.Session) error {
  21. log.Infof("OnOpen session{%s} open", session.Stat())
  22. rpcClient.RegisterGettySession(session)
  23. return nil
  24. }
  25. func (h *ClientEventHandler) OnError(session getty.Session, err error) {
  26. log.Infof("OnError session{%s} got error{%v}, will be closed.", session.Stat(), err)
  27. }
  28. func (h *ClientEventHandler) OnClose(session getty.Session) {
  29. log.Infof("OnClose session{%s} is closing......", session.Stat())
  30. }
  31. func (h *ClientEventHandler) OnMessage(session getty.Session, pkg interface{}) {
  32. s, ok := pkg.(string)
  33. if !ok {
  34. log.Infof("illegal packge{%#v}", pkg)
  35. return
  36. }
  37. log.Infof("OnMessage: %s", s)
  38. }
  39. func (h *ClientEventHandler) OnCron(session getty.Session) {
  40. active := session.GetActive()
  41. if 20*time.Second.Nanoseconds() < time.Since(active).Nanoseconds() {
  42. log.Infof("OnCorn session{%s} timeout{%s}", session.Stat(), time.Since(active).String())
  43. session.Close()
  44. }
  45. }
  46. func (client *ClientEventHandler) sendMergedMessage(mergedMessage protocol.MergedWarpMessage) {
  47. ss := rpcClient.AcquireGettySession()
  48. err := client.sendAsync(ss, mergedMessage)
  49. if err != nil {
  50. log.Errorf("error sendMergedMessage")
  51. }
  52. }
  53. func (client *ClientEventHandler) sendAsync(session getty.Session, msg interface{}) error {
  54. var err error
  55. if session == nil || session.IsClosed() {
  56. log.Warn("sendAsyncRequestWithResponse nothing, caused by null channel.")
  57. }
  58. idGenerator := atomic.Uint32{}
  59. rpcMessage := protocol.RpcMessage{
  60. ID: int32(idGenerator.Inc()),
  61. MessageType: protocol.MSGTypeRequestOneway,
  62. Codec: codec.SEATA,
  63. Compressor: 0,
  64. Body: msg,
  65. }
  66. log.Infof("store message, id %d : %#v", rpcMessage.ID, msg)
  67. //client.mergeMsgMap.Store(rpcMessage.ID, msg)
  68. //config timeout
  69. pkgLen, sendLen, err := session.WritePkg(rpcMessage, time.Duration(0))
  70. if err != nil || (pkgLen != 0 && pkgLen != sendLen) {
  71. log.Warnf("start to close the session because %d of %d bytes data is sent success. err:%+v", sendLen, pkgLen, err)
  72. //runtime.GoWithRecover(func() {
  73. // session.Close()
  74. //}, nil)
  75. return errors.Wrap(err, "pkg not send completely!")
  76. }
  77. return nil
  78. }

Go Implementation For Seata