private void flushInvalidationMessages( String cacheName, InvalidationEventQueue invalidationMessageQueue) { // If still in progress, no need to another attempt. So just ignore. if (invalidationMessageQueue.tryAcquire()) { try { CacheBatchInvalidationMessage batchInvalidationMessage = new CacheBatchInvalidationMessage(cacheName, invalidationMessageQueue.size()); CacheSingleInvalidationMessage invalidationMessage; final int size = invalidationMessageQueue.size(); // At most, poll from the invalidation queue as the current size of the queue before start // to polling. // So skip new invalidation queue items offered while the polling in progress in this round. for (int i = 0; i < size; i++) { invalidationMessage = invalidationMessageQueue.poll(); if (invalidationMessage == null) { break; } batchInvalidationMessage.addInvalidationMessage(invalidationMessage); } EventService eventService = nodeEngine.getEventService(); Collection<EventRegistration> registrations = eventService.getRegistrations(ICacheService.SERVICE_NAME, cacheName); if (!registrations.isEmpty()) { eventService.publishEvent( ICacheService.SERVICE_NAME, registrations, batchInvalidationMessage, cacheName.hashCode()); } } finally { invalidationMessageQueue.release(); } } }
@Override public void run() { Thread currentThread = Thread.currentThread(); for (Map.Entry<String, InvalidationEventQueue> entry : invalidationMessageMap.entrySet()) { if (currentThread.isInterrupted()) { break; } InvalidationEventQueue invalidationMessageQueue = entry.getValue(); if (invalidationMessageQueue.size() > 0) { flushInvalidationMessages(entry.getKey(), invalidationMessageQueue); } } }
private void sendBatchInvalidationEvent(String name, Data key, String sourceUuid) { EventService eventService = nodeEngine.getEventService(); Collection<EventRegistration> registrations = eventService.getRegistrations(ICacheService.SERVICE_NAME, name); if (registrations.isEmpty()) { return; } InvalidationEventQueue invalidationMessageQueue = invalidationMessageMap.get(name); if (invalidationMessageQueue == null) { InvalidationEventQueue newInvalidationMessageQueue = new InvalidationEventQueue(); invalidationMessageQueue = invalidationMessageMap.putIfAbsent(name, newInvalidationMessageQueue); if (invalidationMessageQueue == null) { invalidationMessageQueue = newInvalidationMessageQueue; } } CacheSingleInvalidationMessage invalidationMessage = new CacheSingleInvalidationMessage(name, key, sourceUuid); invalidationMessageQueue.offer(invalidationMessage); if (invalidationMessageQueue.size() >= invalidationMessageBatchSize) { flushInvalidationMessages(name, invalidationMessageQueue); } }