/// <summary> /// Starts the continuous query. /// </summary> private ClientContinuousQueryHandle QueryContinuousInternal( ContinuousQueryClient <TK, TV> continuousQuery) { Debug.Assert(continuousQuery != null); Debug.Assert(continuousQuery.Listener != null); var listener = continuousQuery.Listener; return(DoOutInOp( ClientOp.QueryContinuous, ctx => WriteContinuousQuery(ctx, continuousQuery), ctx => { var queryId = ctx.Stream.ReadLong(); var qryHandle = new ClientContinuousQueryHandle(ctx.Socket, queryId); ctx.Socket.AddNotificationHandler(queryId, (stream, err) => HandleContinuousQueryEvents(stream, err, listener, qryHandle)); return qryHandle; })); }
/// <summary> /// Handles continuous query events. /// </summary> private void HandleContinuousQueryEvents(IBinaryStream stream, Exception err, ICacheEntryEventListener <TK, TV> listener, ClientContinuousQueryHandle qryHandle) { if (err != null) { qryHandle.OnError(err); return; } var flags = (ClientFlags)stream.ReadShort(); var opCode = (ClientOp)stream.ReadShort(); if ((flags & ClientFlags.Error) == ClientFlags.Error) { var status = (ClientStatusCode)stream.ReadInt(); var msg = _marsh.Unmarshal <string>(stream); GetLogger().Error("Error while handling Continuous Query notification ({0}): {1}", status, msg); qryHandle.OnError(new IgniteClientException(msg, null, status)); return; } if (opCode == ClientOp.QueryContinuousEventNotification) { var evts = ContinuousQueryUtils.ReadEvents <TK, TV>(stream, _marsh, _keepBinary); listener.OnEvent(evts); return; } GetLogger().Error("Error while handling Continuous Query notification: unexpected op '{0}'", opCode); }