use of javax.cache.event.CacheEntryEvent in project ignite by apache.
the class CacheContinuousQueryCounterAbstractTest method testEntriesByFilter.
/**
* @throws Exception If failed.
*/
public void testEntriesByFilter() throws Exception {
IgniteCache<Integer, Integer> cache = grid(0).cache(CACHE_NAME);
ContinuousQuery<Integer, Integer> qry = new ContinuousQuery<>();
final Map<Integer, List<T2<Integer, Long>>> map = new HashMap<>();
final CountDownLatch latch = new CountDownLatch(8);
qry.setLocalListener(new CacheEntryUpdatedListener<Integer, Integer>() {
@Override
public void onUpdated(Iterable<CacheEntryEvent<? extends Integer, ? extends Integer>> evts) {
for (CacheEntryEvent<? extends Integer, ? extends Integer> e : evts) {
synchronized (map) {
List<T2<Integer, Long>> vals = map.get(e.getKey());
if (vals == null) {
vals = new ArrayList<>();
map.put(e.getKey(), vals);
}
vals.add(new T2<>(e.getValue(), e.unwrap(CacheQueryEntryEvent.class).getPartitionUpdateCounter()));
}
latch.countDown();
}
}
});
qry.setRemoteFilter(new CacheEntryEventSerializableFilter<Integer, Integer>() {
@Override
public boolean evaluate(CacheEntryEvent<? extends Integer, ? extends Integer> evt) {
return evt.getValue() % 2 == 0;
}
});
try (QueryCursor<Cache.Entry<Integer, Integer>> ignored = cache.query(qry)) {
cache.put(1, 1);
cache.put(1, 2);
cache.put(1, 3);
cache.put(1, 4);
cache.put(2, 1);
cache.put(2, 2);
cache.put(2, 3);
cache.put(2, 4);
cache.remove(1);
cache.remove(2);
cache.put(1, 10);
cache.put(2, 40);
assert latch.await(LATCH_TIMEOUT, MILLISECONDS);
assertEquals(2, map.size());
List<T2<Integer, Long>> vals = map.get(1);
assertNotNull(vals);
assertEquals(4, vals.size());
assertEquals((int) vals.get(0).get1(), 2);
assertEquals((long) vals.get(0).get1(), (long) vals.get(0).get2());
assertEquals((int) vals.get(1).get1(), 4);
assertEquals((long) vals.get(1).get1(), (long) vals.get(1).get2());
assertNull(vals.get(2).get1());
assertEquals(5, (long) vals.get(2).get2());
assertEquals((int) vals.get(3).get1(), 10);
assertEquals(6, (long) vals.get(3).get2());
vals = map.get(2);
assertNotNull(vals);
assertEquals(4, vals.size());
assertEquals((int) vals.get(0).get1(), 2);
assertEquals((long) vals.get(0).get1(), (long) vals.get(0).get2());
assertEquals((int) vals.get(1).get1(), 4);
assertEquals((long) vals.get(1).get1(), (long) vals.get(1).get2());
assertNull(vals.get(2).get1());
assertEquals(5, (long) vals.get(2).get2());
assertEquals((int) vals.get(3).get1(), 40);
assertEquals(6, (long) vals.get(3).get2());
}
}
use of javax.cache.event.CacheEntryEvent in project ignite by apache.
the class CacheContinuousQueryExecuteInPrimaryTest method doTestWithoutEventsEntries.
/**
* @throws Exception If failed.
*/
private void doTestWithoutEventsEntries(CacheConfiguration<Integer, String> ccfg) throws Exception {
try (IgniteCache<Integer, String> cache = grid(0).createCache(ccfg)) {
int ITERATION_CNT = 100;
final AtomicBoolean noOneListen = new AtomicBoolean(true);
for (int i = 0; i < ITERATION_CNT; i++) {
ContinuousQuery<Integer, String> qry = new ContinuousQuery<>();
qry.setLocalListener(new CacheEntryUpdatedListener<Integer, String>() {
@Override
public void onUpdated(Iterable<CacheEntryEvent<? extends Integer, ? extends String>> iterable) throws CacheEntryListenerException {
noOneListen.set(false);
}
});
qry.setRemoteFilterFactory(FactoryBuilder.factoryOf(new CacheEntryEventSerializableFilter<Integer, String>() {
@Override
public boolean evaluate(CacheEntryEvent<? extends Integer, ? extends String> cacheEntryEvent) throws CacheEntryListenerException {
return false;
}
}));
executeQuery(cache, qry, ccfg.getAtomicityMode() == TRANSACTIONAL);
}
assertTrue(noOneListen.get());
} finally {
ignite(0).destroyCache(ccfg.getName());
}
}
use of javax.cache.event.CacheEntryEvent in project ignite by apache.
the class CacheContinuousQueryFailoverAbstractSelfTest method checkEvents.
/**
* @param logAll If {@code true} logs all unexpected values.
* @param expEvts Expected values.
* @param lsnr Listener.
* @return Check status.
*/
@SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
private boolean checkEvents(boolean logAll, Map<Integer, List<T2<Integer, Integer>>> expEvts, CacheEventListener2 lsnr) {
assertTrue(!expEvts.isEmpty());
boolean pass = true;
for (Map.Entry<Integer, List<T2<Integer, Integer>>> e : expEvts.entrySet()) {
Integer key = e.getKey();
List<T2<Integer, Integer>> exp = e.getValue();
List<CacheEntryEvent<?, ?>> rcvdEvts = lsnr.evts.get(key);
if (rcvdEvts == null) {
pass = false;
log.info("No events for key [key=" + key + ", exp=" + e.getValue() + ']');
if (!logAll)
return false;
} else {
synchronized (rcvdEvts) {
if (rcvdEvts.size() != exp.size()) {
pass = false;
log.info("Missed or extra events for key [key=" + key + ", exp=" + e.getValue() + ", rcvd=" + rcvdEvts + ']');
if (!logAll)
return false;
}
int cnt = Math.min(rcvdEvts.size(), exp.size());
for (int i = 0; i < cnt; i++) {
T2<Integer, Integer> expEvt = exp.get(i);
CacheEntryEvent<?, ?> rcvdEvt = rcvdEvts.get(i);
if (pass) {
assertEquals(key, rcvdEvt.getKey());
assertEquals(expEvt.get1(), rcvdEvt.getValue());
} else {
if (!key.equals(rcvdEvt.getKey()) || !expEvt.get1().equals(rcvdEvt.getValue()))
log.warning("Missed events. [key=" + key + ", actKey=" + rcvdEvt.getKey() + ", expVal=" + expEvt.get1() + ", actVal=" + rcvdEvt.getValue() + "]");
}
}
if (!pass) {
for (int i = cnt; i < exp.size(); i++) {
T2<Integer, Integer> val = exp.get(i);
log.warning("Missed events. [key=" + key + ", expVal=" + val.get1() + ", prevVal=" + val.get2() + "]");
}
}
}
}
}
if (pass) {
expEvts.clear();
lsnr.evts.clear();
}
return pass;
}
use of javax.cache.event.CacheEntryEvent in project ignite by apache.
the class CacheContinuousQueryOrderingEventTest method doOrderingTest.
/**
* @param ccfg Cache configuration.
* @param async Async filter.
* @throws Exception If failed.
*/
protected void doOrderingTest(final CacheConfiguration ccfg, final boolean async) throws Exception {
ignite(0).createCache(ccfg);
List<QueryCursor<?>> qries = new ArrayList<>();
try {
List<BlockingQueue<CacheEntryEvent<QueryTestKey, QueryTestValue>>> rcvdEvts = new ArrayList<>(LISTENER_CNT * NODES);
final AtomicInteger qryCntr = new AtomicInteger(0);
final int threadCnt = 20;
for (int idx = 0; idx < NODES; idx++) {
for (int i = 0; i < LISTENER_CNT; i++) {
BlockingQueue<CacheEntryEvent<QueryTestKey, QueryTestValue>> queue = new ArrayBlockingQueue<>(ITERATION_CNT * threadCnt);
ContinuousQuery qry = new ContinuousQuery();
if (async) {
qry.setLocalListener(new TestCacheAsyncEventListener(queue, qryCntr));
qry.setRemoteFilterFactory(FactoryBuilder.factoryOf(new CacheTestRemoteFilterAsync(ccfg.getName())));
} else {
qry.setLocalListener(new TestCacheEventListener(queue, qryCntr));
qry.setRemoteFilterFactory(FactoryBuilder.factoryOf(new CacheTestRemoteFilter(ccfg.getName())));
}
rcvdEvts.add(queue);
IgniteCache<Object, Object> cache = grid(idx).cache(ccfg.getName());
QueryCursor qryCursor = cache.query(qry);
qries.add(qryCursor);
}
}
IgniteInternalFuture<Long> f = GridTestUtils.runMultiThreadedAsync(new Runnable() {
@Override
public void run() {
ThreadLocalRandom rnd = ThreadLocalRandom.current();
for (int i = 0; i < ITERATION_CNT; i++) {
IgniteCache<QueryTestKey, QueryTestValue> cache = grid(rnd.nextInt(NODES)).cache(ccfg.getName());
QueryTestKey key = new QueryTestKey(rnd.nextInt(KEYS));
boolean startTx = cache.getConfiguration(CacheConfiguration.class).getAtomicityMode() == TRANSACTIONAL && rnd.nextBoolean();
Transaction tx = null;
if (startTx)
tx = cache.unwrap(Ignite.class).transactions().txStart();
try {
if ((cache.get(key) == null) || rnd.nextBoolean()) {
cache.invoke(key, new CacheEntryProcessor<QueryTestKey, QueryTestValue, Object>() {
@Override
public Object process(MutableEntry<QueryTestKey, QueryTestValue> entry, Object... arguments) throws EntryProcessorException {
if (entry.exists())
entry.setValue(new QueryTestValue(entry.getValue().val1 + 1));
else
entry.setValue(new QueryTestValue(0));
return null;
}
});
} else {
QueryTestValue val;
QueryTestValue newVal;
do {
val = cache.get(key);
newVal = val == null ? new QueryTestValue(0) : new QueryTestValue(val.val1 + 1);
} while (!cache.replace(key, val, newVal));
}
} finally {
if (tx != null)
tx.commit();
}
}
}
}, threadCnt, "put-thread");
f.get(15, TimeUnit.SECONDS);
GridTestUtils.waitForCondition(new PA() {
@Override
public boolean apply() {
return qryCntr.get() >= ITERATION_CNT * threadCnt * LISTENER_CNT * NODES;
}
}, 1000L);
for (BlockingQueue<CacheEntryEvent<QueryTestKey, QueryTestValue>> queue : rcvdEvts) checkEvents(queue, ITERATION_CNT * threadCnt);
assertFalse("Ordering invocations of filter broken.", fail);
} finally {
for (QueryCursor<?> qry : qries) qry.close();
ignite(0).destroyCache(ccfg.getName());
}
}
use of javax.cache.event.CacheEntryEvent in project ignite by apache.
the class CacheContinuousQueryRandomOperationsTest method testFilterAndFactoryProvided.
/**
* @throws Exception If failed.
*/
public void testFilterAndFactoryProvided() throws Exception {
final CacheConfiguration<Object, Object> ccfg = cacheConfiguration(PARTITIONED, 1, ATOMIC, false);
grid(0).createCache(ccfg);
try {
final ContinuousQuery qry = new ContinuousQuery();
qry.setRemoteFilterFactory(new Factory<CacheEntryEventFilter>() {
@Override
public CacheEntryEventFilter create() {
return null;
}
});
qry.setRemoteFilter(new CacheEntryEventSerializableFilter() {
@Override
public boolean evaluate(CacheEntryEvent event) throws CacheEntryListenerException {
return false;
}
});
qry.setLocalListener(new CacheEntryUpdatedListener() {
@Override
public void onUpdated(Iterable iterable) throws CacheEntryListenerException {
// No-op.
}
});
GridTestUtils.assertThrows(log, new Callable<Object>() {
@Override
public Object call() throws Exception {
return grid(0).cache(ccfg.getName()).query(qry);
}
}, IgniteException.class, null);
} finally {
grid(0).destroyCache(ccfg.getName());
}
}
Aggregations