Exemplo n.º 1
0
        public void TestExpiredEventsAreDeliveredWhenIncludeExpiredIsTrue()
        {
            var cache = Client.GetOrCreateCache <int, int>(TestUtils.TestName)
                        .WithExpiryPolicy(new ExpiryPolicy(TimeSpan.FromMilliseconds(100), null, null));

            var events = new ConcurrentQueue <ICacheEntryEvent <int, int> >();
            var qry    = new ContinuousQueryClient <int, int>(new DelegateListener <int, int>(events.Enqueue))
            {
                IncludeExpired = true
            };

            using (cache.QueryContinuous(qry))
            {
                cache[1] = 2;

                TestUtils.WaitForTrueCondition(() => events.Count == 2, 5000);
            }

            Assert.AreEqual(2, events.Count);
            Assert.AreEqual(CacheEntryEventType.Created, events.First().EventType);
            Assert.AreEqual(CacheEntryEventType.Expired, events.Last().EventType);

            Assert.IsTrue(events.Last().HasValue);
            Assert.IsTrue(events.Last().HasOldValue);
            Assert.AreEqual(2, events.Last().Value);
            Assert.AreEqual(2, events.Last().OldValue);
            Assert.AreEqual(1, events.Last().Key);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Tests batching behavior.
        /// </summary>
        private void TestBatches(int keyCount, int bufferSize, TimeSpan interval,
                                 Action <List <int>, ConcurrentQueue <List <int> > > assert)
        {
            var res = new ConcurrentQueue <List <int> >();

            var qry = new ContinuousQueryClient <int, int>
            {
                Listener = new DelegateBatchListener <int, int>(evts =>
                                                                res.Enqueue(evts.Select(e => e.Key).ToList())),
                BufferSize   = bufferSize,
                TimeInterval = interval
            };

            var cache       = Client.GetOrCreateCache <int, int>(TestUtils.TestName);
            var server      = Ignition.GetIgnite("1");
            var serverCache = server.GetCache <int, int>(cache.Name);

            // Use primary keys for "remote" node to ensure batching.
            // Client is connected to another server node, so it will receive batches as expected.
            var keys = TestUtils.GetPrimaryKeys(server, cache.Name).Take(keyCount).ToList();

            using (cache.QueryContinuous(qry))
            {
                keys.ForEach(k => serverCache.Put(k, k));

                assert(keys, res);
            }
        }
Exemplo n.º 3
0
        public void TestExceptionInFilterIsLoggedAndFilterIsIgnored()
        {
            var cache = Client.GetOrCreateCache <int, int>(TestUtils.TestName);

            var evts = new ConcurrentBag <int>();
            var qry  = new ContinuousQueryClient <int, int>(new DelegateListener <int, int>(e => evts.Add(e.Key)))
            {
                Filter = new ExceptionalFilter()
            };

            using (cache.QueryContinuous(qry))
            {
                cache[1] = 1;
            }

            Assert.AreEqual(1, cache[1]);

            // Assert: error is logged.
            var error = GetLoggers()
                        .SelectMany(x => x.Entries)
                        .Where(e => e.Level >= LogLevel.Warn)
                        .Select(e => e.Message)
                        .LastOrDefault();

            Assert.AreEqual(
                "CacheEntryEventFilter failed: javax.cache.event.CacheEntryListenerException: " +
                ExceptionalFilter.Error,
                error);

            // Assert: continuous query event is delivered.
            Assert.AreEqual(new[] { 1 }, evts);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Writes the continuous query.
        /// </summary>
        /// <param name="ctx">Request context.</param>
        /// <param name="continuousQuery">Query.</param>
        private void WriteContinuousQuery(ClientRequestContext ctx, ContinuousQueryClient <TK, TV> continuousQuery)
        {
            var w = ctx.Writer;

            w.WriteInt(continuousQuery.BufferSize);
            w.WriteLong((long)continuousQuery.TimeInterval.TotalMilliseconds);
            w.WriteBoolean(false); // Include expired.

            if (continuousQuery.Filter == null)
            {
                w.WriteObject <object>(null);
            }
            else
            {
                var javaFilter = continuousQuery.Filter as PlatformJavaObjectFactoryProxy;

                if (javaFilter != null)
                {
                    w.WriteObject(javaFilter.GetRawProxy());
                    w.WriteByte(FilterPlatformJava);
                }
                else
                {
                    var filterHolder = new ContinuousQueryFilterHolder(continuousQuery.Filter, _keepBinary);

                    w.WriteObject(filterHolder);
                    w.WriteByte(FilterPlatformDotnet);
                }
            }

            ctx.Socket.ExpectNotifications();
        }
Exemplo n.º 5
0
        public void TestDefaultSettings()
        {
            var qry = new ContinuousQueryClient <int, int>();

            Assert.AreEqual(ContinuousQueryClient.DefaultBufferSize, qry.BufferSize);
            Assert.AreEqual(TimeSpan.Zero, qry.TimeInterval);
        }
Exemplo n.º 6
0
        public void TestClientDisconnectRaisesDisconnectedEventOnQueryHandle()
        {
            ICacheEntryEvent <int, int> lastEvt = null;
            var qry = new ContinuousQueryClient <int, int>(
                new DelegateListener <int, int>(e => lastEvt = e));

            var client = GetClient();
            var cache  = client.GetOrCreateCache <int, int>(TestUtils.TestName);
            var handle = cache.QueryContinuous(qry);

            ContinuousQueryClientDisconnectedEventArgs disconnectedEventArgs = null;

            handle.Disconnected += (sender, args) =>
            {
                disconnectedEventArgs = args;

                // ReSharper disable once AccessToDisposedClosure (disposed state does not matter)
                Assert.AreEqual(handle, sender);
            };

            cache[1] = 1;
            TestUtils.WaitForTrueCondition(() => lastEvt != null);

            client.Dispose();

            // Assert: disconnected event has been raised.
            TestUtils.WaitForTrueCondition(() => disconnectedEventArgs != null);
            Assert.IsNotNull(disconnectedEventArgs.Exception);

            StringAssert.StartsWith("Cannot access a disposed object", disconnectedEventArgs.Exception.Message);

            // Multiple dispose is allowed.
            handle.Dispose();
            handle.Dispose();
        }
Exemplo n.º 7
0
        public void TestContinuousQueryWithKeepBinaryPassesBinaryObjectsToListenerAndFilter()
        {
            var cache    = Client.GetOrCreateCache <int, Person>(TestUtils.TestName);
            var binCache = cache.WithKeepBinary <int, IBinaryObject>();

            var evts = new ConcurrentBag <IBinaryObject>();

            var qry = new ContinuousQueryClient <int, IBinaryObject>
            {
                Listener = new DelegateListener <int, IBinaryObject>(e => evts.Add(e.Value)),
                Filter   = new EvenIdBinaryFilter()
            };

            using (binCache.QueryContinuous(qry))
            {
                cache[2] = new Person(2);
                cache[3] = new Person(3);

                TestUtils.WaitForTrueCondition(() => !evts.IsEmpty);
            }

            // Listener should receive one event with an even id.
            var binObj = evts.Single();

            Assert.IsNotNull(binObj);
            Assert.AreEqual(2, binObj.GetField <int>("Id"));
            Assert.AreEqual("Person 2", binObj.GetField <string>("Name"));

            // Filter has received both events, last one was filtered out.
            binObj = EvenIdBinaryFilter.LastValue;
            Assert.IsNotNull(binObj);
            Assert.AreEqual(3, binObj.GetField <int>("Id"));
            Assert.AreEqual("Person 3", binObj.GetField <string>("Name"));
        }
Exemplo n.º 8
0
        public void TestContinuousQueryWithCustomObjects()
        {
            var cache = Client.GetOrCreateCache <int, Person>(TestUtils.TestName);

            var evts = new ConcurrentBag <Person>();

            var qry = new ContinuousQueryClient <int, Person>
            {
                Listener = new DelegateListener <int, Person>(e => evts.Add(e.Value)),
                Filter   = new EvenIdFilter()
            };

            using (cache.QueryContinuous(qry))
            {
                cache[2] = new Person(2);
                cache[3] = new Person(3);

                TestUtils.WaitForTrueCondition(() => !evts.IsEmpty);
            }

            // Listener should receive one event with an even id.
            var obj = evts.Single();

            Assert.IsNotNull(obj);
            Assert.AreEqual(2, obj.Id);
            Assert.AreEqual("Person 2", obj.Name);

            // Filter has received both events, last one was filtered out.
            obj = EvenIdFilter.LastValue;
            Assert.IsNotNull(obj);
            Assert.AreEqual(3, obj.Id);
            Assert.AreEqual("Person 3", obj.Name);
        }
Exemplo n.º 9
0
        /** <inheritDoc /> */
        public IContinuousQueryHandleClient QueryContinuous(ContinuousQueryClient <TK, TV> continuousQuery)
        {
            IgniteArgumentCheck.NotNull(continuousQuery, "continuousQuery");
            IgniteArgumentCheck.NotNull(continuousQuery.Listener, "continuousQuery.Listener");

            return(QueryContinuousInternal(continuousQuery));
        }
Exemplo n.º 10
0
        public void TestContinuousQueryWithFilterReceivesOnlyMatchingEvents()
        {
            var cache = Client.GetOrCreateCache <int, int>(TestUtils.TestName);

            ICacheEntryEvent <int, int> lastEvt = null;
            var listener = new DelegateListener <int, int>(e => lastEvt = e);

            var qry = new ContinuousQueryClient <int, int>(listener)
            {
                Filter = new OddKeyFilter()
            };

            using (cache.QueryContinuous(qry))
            {
                cache.Put(0, 0);
                TestUtils.WaitForTrueCondition(() => OddKeyFilter.LastKey == 0);
                Assert.IsNull(lastEvt);

                cache.Put(5, 5);
                TestUtils.WaitForTrueCondition(() => OddKeyFilter.LastKey == 5);
                TestUtils.WaitForTrueCondition(() => lastEvt != null);
                Assert.IsNotNull(lastEvt);
                Assert.AreEqual(5, lastEvt.Key);

                cache.Put(8, 8);
                TestUtils.WaitForTrueCondition(() => OddKeyFilter.LastKey == 8);
                Assert.AreEqual(5, lastEvt.Key);
            }
        }
Exemplo n.º 11
0
        public void TestComputeWorksWhenContinuousQueryIsActive()
        {
            var cache = Client.GetOrCreateCache <int, int>(TestUtils.TestName);

            var receivedKeysAll = new ConcurrentBag <int>();
            var receivedKeysOdd = new ConcurrentBag <int>();

            var qry1 = new ContinuousQueryClient <int, int>
            {
                Listener = new DelegateListener <int, int>(e => receivedKeysOdd.Add(e.Key)),
                Filter   = new OddKeyFilter()
            };

            var qry2 = new ContinuousQueryClient <int, int>
            {
                Listener = new DelegateListener <int, int>(e => receivedKeysAll.Add(e.Key)),
            };

            var cts = new CancellationTokenSource();

            var computeRunnerTask = Task.Factory.StartNew(() =>
            {
                while (!cts.IsCancellationRequested)
                {
                    var res = Client.GetCompute().ExecuteJavaTask <int>(
                        ComputeApiTest.EchoTask, ComputeApiTest.EchoTypeInt);

                    Assert.AreEqual(1, res);
                }
            }, cts.Token);

            var keys = Enumerable.Range(1, 10000).ToArray();

            using (cache.QueryContinuous(qry1))
                using (cache.QueryContinuous(qry2))
                {
                    foreach (var key in keys)
                    {
                        cache[key] = key;
                    }
                }

            cts.Cancel();
            computeRunnerTask.Wait();

            TestUtils.WaitForTrueCondition(() => receivedKeysAll.Count == keys.Length);
            Assert.AreEqual(keys.Length / 2, receivedKeysOdd.Count);

            CollectionAssert.AreEquivalent(keys, receivedKeysAll);
            CollectionAssert.AreEquivalent(keys.Where(k => k % 2 == 1), receivedKeysOdd);
        }
Exemplo n.º 12
0
        public void TestContinuousQueryCountIsLimitedByMaxCursors()
        {
            var cache = Client.GetOrCreateCache <int, int>(TestUtils.TestName);

            var qry = new ContinuousQueryClient <int, int>(new DelegateListener <int, int>());

            var queries = Enumerable.Range(1, MaxCursors).Select(_ => cache.QueryContinuous(qry)).ToList();

            var ex = Assert.Throws <IgniteClientException>(() => cache.QueryContinuous(qry));

            queries.ForEach(q => q.Dispose());

            StringAssert.StartsWith("Too many open cursors", ex.Message);
            Assert.AreEqual(ClientStatusCode.TooManyCursors, ex.StatusCode);
        }
Exemplo n.º 13
0
        public void TestContinuousQueryCallsLocalListenerWithCorrectEvent()
        {
            var cache = Client.GetOrCreateCache <int, int>(TestUtils.TestName);

            var events = new List <ICacheEntryEvent <int, int> >();
            var qry    = new ContinuousQueryClient <int, int>(new DelegateListener <int, int>(events.Add));

            using (cache.QueryContinuous(qry))
            {
                // Create.
                cache.Put(1, 1);
                TestUtils.WaitForTrueCondition(() => events.Count == 1);

                var evt = events.Single();
                Assert.AreEqual(CacheEntryEventType.Created, evt.EventType);
                Assert.IsFalse(evt.HasOldValue);
                Assert.IsTrue(evt.HasValue);
                Assert.AreEqual(1, evt.Key);
                Assert.AreEqual(1, evt.Value);

                // Update.
                cache.Put(1, 2);
                TestUtils.WaitForTrueCondition(() => events.Count == 2);

                evt = events.Last();
                Assert.AreEqual(CacheEntryEventType.Updated, evt.EventType);
                Assert.IsTrue(evt.HasOldValue);
                Assert.IsTrue(evt.HasValue);
                Assert.AreEqual(1, evt.Key);
                Assert.AreEqual(2, evt.Value);
                Assert.AreEqual(1, evt.OldValue);

                // Remove.
                cache.Remove(1);
                TestUtils.WaitForTrueCondition(() => events.Count == 3);

                evt = events.Last();
                Assert.AreEqual(CacheEntryEventType.Removed, evt.EventType);
                Assert.IsTrue(evt.HasOldValue);
                Assert.IsTrue(evt.HasValue);
                Assert.AreEqual(1, evt.Key);
                Assert.AreEqual(2, evt.Value);
                Assert.AreEqual(2, evt.OldValue);
            }
        }
Exemplo n.º 14
0
        public void TestClientDisconnectDoesNotRaiseDisconnectedEventOnDisposedQueryHandle()
        {
            var qry = new ContinuousQueryClient <int, int>(new DelegateListener <int, int>());

            var client = GetClient();
            var cache  = client.GetOrCreateCache <int, int>(TestUtils.TestName);
            ContinuousQueryClientDisconnectedEventArgs disconnectedEventArgs = null;

            using (var handle = cache.QueryContinuous(qry))
            {
                handle.Disconnected += (sender, args) => disconnectedEventArgs = args;
            }

            client.Dispose();

            // Assert: disconnected event has NOT been raised.
            Assert.IsNull(disconnectedEventArgs);
        }
Exemplo n.º 15
0
        public void TestMultipleQueriesMultithreaded()
        {
            var cache = Ignition.GetIgnite().GetOrCreateCache <int, int>(TestUtils.TestName);

            cache.Put(1, 0);

            var cts           = new CancellationTokenSource();
            var updaterThread = Task.Factory.StartNew(() =>
            {
                for (long i = 0; i < long.MaxValue && !cts.IsCancellationRequested; i++)
                {
                    cache.Put(1, (int)i);
                }
            });

            var clientCache = Client.GetCache <int, int>(cache.Name);

            TestUtils.RunMultiThreaded(() =>
            {
                var evt = new ManualResetEventSlim();

                var qry = new ContinuousQueryClient <int, int>
                {
                    Listener = new DelegateListener <int, int>(e =>
                    {
                        Assert.AreEqual(1, e.Key);
                        Assert.AreEqual(CacheEntryEventType.Updated, e.EventType);
                        evt.Set();
                    })
                };

                for (var i = 0; i < 200; i++)
                {
                    evt.Reset();
                    using (clientCache.QueryContinuous(qry))
                    {
                        evt.Wait();
                    }
                }
            }, 16);

            cts.Cancel();
            updaterThread.Wait();
        }
Exemplo n.º 16
0
        public static void Main()
        {
            using (IIgniteClient ignite = Ignition.StartClient(Utils.GetThinClientConfiguration()))
            {
                Console.WriteLine();
                Console.WriteLine(">>> Cache continuous query example started.");

                var cache = ignite.GetOrCreateCache <int, string>(CacheName);

                // Clean up caches on all nodes before run.
                cache.Clear();

                const int keyCnt = 20;

                for (int i = 0; i < keyCnt; i++)
                {
                    cache.Put(i, i.ToString());
                }

                var qry = new ContinuousQueryClient <int, string>
                {
                    Listener = new Listener <string>(),
                    Filter   = new ContinuousQueryFilter(15)
                };

                // Create new continuous query.
                using (cache.QueryContinuous(qry))
                {
                    // Add a few more keys and watch more query notifications.
                    for (var i = keyCnt; i < keyCnt + 5; i++)
                    {
                        cache.Put(i, i.ToString());
                    }

                    // Wait for a while while callback is notified about remaining puts.
                    Thread.Sleep(2000);
                }
            }

            Console.WriteLine();
            Console.WriteLine(">>> Example finished, press any key to exit ...");
            Console.ReadKey();
        }
Exemplo n.º 17
0
        public void TestContinuousQueryWithJavaFilterReceivesOnlyMatchingEvents()
        {
            var cache = Client.GetOrCreateCache <int, int>(TestUtils.TestName);

            var evts     = new ConcurrentBag <int>();
            var listener = new DelegateListener <int, int>(e => evts.Add(e.Key));

            var qry = new ContinuousQueryClient <int, int>(listener)
            {
                Filter = new JavaObject("org.apache.ignite.platform.PlatformCacheEntryEvenKeyEventFilter", null)
                         .ToCacheEntryEventFilter <int, int>()
            };

            using (cache.QueryContinuous(qry))
            {
                cache.PutAll(Enumerable.Range(1, 5).ToDictionary(x => x, x => x));
            }

            TestUtils.WaitForTrueCondition(() => evts.Count == 2);
            CollectionAssert.AreEquivalent(new[] { 2, 4 }, evts);
        }
Exemplo n.º 18
0
        public void TestIncludeExpiredIsFalseByDefaultAndExpiredEventsAreSkipped()
        {
            var cache = Client.GetOrCreateCache <int, int>(TestUtils.TestName)
                        .WithExpiryPolicy(new ExpiryPolicy(TimeSpan.FromMilliseconds(100), null, null));

            var events = new ConcurrentQueue <ICacheEntryEvent <int, int> >();
            var qry    = new ContinuousQueryClient <int, int>(new DelegateListener <int, int>(events.Enqueue));

            Assert.IsFalse(qry.IncludeExpired);

            using (cache.QueryContinuous(qry))
            {
                cache[1] = 2;

                TestUtils.WaitForTrueCondition(() => !cache.ContainsKey(1), 5000);

                cache[2] = 3;
            }

            Assert.AreEqual(2, events.Count);
            Assert.AreEqual(CacheEntryEventType.Created, events.First().EventType);
            Assert.AreEqual(CacheEntryEventType.Created, events.Last().EventType);
        }
Exemplo n.º 19
0
        /// <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;
            }));
        }
Exemplo n.º 20
0
 public IContinuousQueryHandleClient QueryContinuous(ContinuousQueryClient <TK, TV> continuousQuery)
 {
     throw new NotImplementedException();
 }