|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- package rpc11
-
- import (
- "time"
- )
-
- import (
- getty "github.com/apache/dubbo-getty"
-
- "github.com/pkg/errors"
-
- "go.uber.org/atomic"
- )
-
- import (
- "github.com/seata/seata-go/pkg/protocol"
- "github.com/seata/seata-go/pkg/protocol/codec"
- log "github.com/seata/seata-go/pkg/util/log"
- )
-
- type ClientEventHandler struct {
- }
-
- func NewClientEventHandler() *ClientEventHandler {
- return &ClientEventHandler{}
- }
-
- func (h *ClientEventHandler) OnOpen(session getty.Session) error {
- log.Infof("OnOpen session{%s} open", session.Stat())
- rpcClient.RegisterGettySession(session)
- return nil
- }
-
- func (h *ClientEventHandler) OnError(session getty.Session, err error) {
- log.Infof("OnError session{%s} got error{%v}, will be closed.", session.Stat(), err)
- }
-
- func (h *ClientEventHandler) OnClose(session getty.Session) {
- log.Infof("OnClose session{%s} is closing......", session.Stat())
- }
-
- func (h *ClientEventHandler) OnMessage(session getty.Session, pkg interface{}) {
- s, ok := pkg.(string)
- if !ok {
- log.Infof("illegal packge{%#v}", pkg)
- return
- }
-
- log.Infof("OnMessage: %s", s)
- }
-
- func (h *ClientEventHandler) OnCron(session getty.Session) {
- active := session.GetActive()
- if 20*time.Second.Nanoseconds() < time.Since(active).Nanoseconds() {
- log.Infof("OnCorn session{%s} timeout{%s}", session.Stat(), time.Since(active).String())
- session.Close()
- }
- }
-
- func (client *ClientEventHandler) sendMergedMessage(mergedMessage protocol.MergedWarpMessage) {
- ss := rpcClient.AcquireGettySession()
- err := client.sendAsync(ss, mergedMessage)
- if err != nil {
- log.Errorf("error sendMergedMessage")
- }
- }
-
- func (client *ClientEventHandler) sendAsync(session getty.Session, msg interface{}) error {
- var err error
- if session == nil || session.IsClosed() {
- log.Warn("sendAsyncRequestWithResponse nothing, caused by null channel.")
- }
- idGenerator := atomic.Uint32{}
- rpcMessage := protocol.RpcMessage{
- ID: int32(idGenerator.Inc()),
- MessageType: protocol.MSGTypeRequestOneway,
- Codec: codec.SEATA,
- Compressor: 0,
- Body: msg,
- }
- log.Infof("store message, id %d : %#v", rpcMessage.ID, msg)
- //client.mergeMsgMap.Store(rpcMessage.ID, msg)
- //config timeout
- pkgLen, sendLen, err := session.WritePkg(rpcMessage, time.Duration(0))
- if err != nil || (pkgLen != 0 && pkgLen != sendLen) {
- log.Warnf("start to close the session because %d of %d bytes data is sent success. err:%+v", sendLen, pkgLen, err)
- //runtime.GoWithRecover(func() {
- // session.Close()
- //}, nil)
- return errors.Wrap(err, "pkg not send completely!")
- }
- return nil
- }
|