コード例 #1
0
        // Called when a message is received
        private void OnReceive(object sender, MessageEventArgs args)
        {
            if (_cts.IsCancellationRequested)
            {
                Log.To.ChangeTracker.I(Tag, "{0} Cancellation requested, aborting in OnReceive", this);
                return;
            }

            if (args.IsPing)
            {
                _client.Ping();
                return;
            }

            try {
                if (args.RawData.Length == 0)
                {
                    return;
                }

                var responseStream = new MemoryStream();
                responseStream.WriteByte(args.IsText ? (byte)1 : (byte)2);
                responseStream.Write(args.RawData, 0, args.RawData.Length);
                responseStream.Seek(0, SeekOrigin.Begin);
                _responseLogic.ProcessResponseStream(responseStream, _cts.Token);
            } catch (Exception e) {
                Log.To.ChangeTracker.E(Tag, String.Format("{0} is not parseable", GetLogString(args)), e);
            }
        }
コード例 #2
0
        private Task ChangeFeedResponseHandler(Task <HttpResponseMessage> responseTask)
        {
            if (ResponseFailed(responseTask))
            {
                return(Task.FromResult(false));
            }

            var response = responseTask.Result;

            UpdateServerType(response);

            if (response.Content == null)
            {
                throw Misc.CreateExceptionAndLog(Log.To.ChangeTracker, response.StatusCode.GetStatusCode(), Tag,
                                                 "Got empty change tracker response");
            }

            Log.To.ChangeTracker.D(Tag, "Getting stream from change tracker response");
            return(response.Content.ReadAsStreamAsync().ContinueWith((Task <Stream> t) =>
            {
                try {
                    var result = _responseLogic.ProcessResponseStream(t.Result, changesFeedRequestTokenSource.Token);
                    Backoff.ResetBackoff();
                    if (result == ChangeTrackerResponseCode.ChangeHeartbeat)
                    {
                        Heartbeat = _responseLogic.Heartbeat;
                        _workExecutor.StartNew(Run);
                    }
                } catch (CouchbaseLiteException e) {
                    if (e.Code == StatusCode.BadJson)
                    {
                        Log.To.ChangeTracker.W(Tag, "{0} Couldn't parse JSON from remote, " +
                                               "retrying in {1}ms", this, Backoff.GetSleepTime().TotalMilliseconds);
                        Backoff.DelayAppropriateAmountOfTime().ContinueWith(t1 =>
                        {
                            Log.To.ChangeTracker.I(Tag, "{0} retrying NOW...", this);
                            _workExecutor.StartNew(Run);
                        });
                    }
                } catch (Exception e) {
                    RetryOrStopIfNecessary(e);
                } finally {
                    Misc.SafeDispose(ref changesFeedRequestTokenSource);
                    response.Dispose();
                }
            }));
        }