internal void OnSelectiveEventsMessageRecieved(MessageEventItem eventMessage) { string key = eventMessage.Key; CallbackInfo cbInfo = new CallbackInfo(null, eventMessage.Callback, eventMessage.DataFilter); EventHandle handle = null; if (cbInfo != null) { short handler = (short)cbInfo.Callback; handle = new EventHandle(handler); } switch (eventMessage.EventType) { case Alachisoft.NCache.Persistence.EventType.ITEM_UPDATED_CALLBACK: RaiseSelectiveCacheNotification(key, EventType.ItemUpdated, eventMessage.Item, eventMessage.OldItem, CacheItemRemovedReason.Underused, false, handle, cbInfo.DataFilter); break; case Alachisoft.NCache.Persistence.EventType.ITEM_REMOVED_CALLBACK: RaiseSelectiveCacheNotification(key, EventType.ItemRemoved, eventMessage.Item, null, eventMessage.Reason, false, handle, cbInfo.DataFilter); break; } }
private bool RegisterGeneralDiscriptor(CacheEventDescriptor discriptor, EventTypeInternal eventType) { if (discriptor == null) { return(false); //FAIL CONDITION } EventHandle handle = null; foreach (EventTypeInternal type in Enum.GetValues(typeof(EventTypeInternal))) { ResourcePool pool = null; bool registrationUpdated = false; #region Pool selection if ((type & eventType) != 0) { pool = GetEventPool(type); } if (pool == null) { continue; } #endregion short registrationSequenceId = -1; lock (SyncLockGeneral) { pool.AddResource(discriptor, 1); // Everytime a new Discriptor is forcefully created //Keeps a sequence number switch (type) { case EventTypeInternal.ItemAdded: if (discriptor.DataFilter > _generalAddDataFilter || _addEventRegistrationSequence == REFSTART) { registrationUpdated = true; registrationSequenceId = ++_addEventRegistrationSequence; _generalAddDataFilter = discriptor.DataFilter; } else { registrationSequenceId = _addEventRegistrationSequence; } break; case EventTypeInternal.ItemRemoved: if (discriptor.DataFilter > _generalRemoveDataFilter || _removeEventRegistrationSequenceId == REFSTART) { registrationUpdated = true; registrationSequenceId = ++_removeEventRegistrationSequenceId; _generalRemoveDataFilter = discriptor.DataFilter; } else { registrationSequenceId = _removeEventRegistrationSequenceId; } break; case EventTypeInternal.ItemUpdated: if (discriptor.DataFilter > _generalUpdateDataFilter || _updateEventRegisrationSequenceId == REFSTART) { registrationUpdated = true; registrationSequenceId = ++_updateEventRegisrationSequenceId; _generalUpdateDataFilter = discriptor.DataFilter; } else { registrationSequenceId = _updateEventRegisrationSequenceId; } break; } //Although the handle doesnt matter in general events if (handle == null) { handle = new EventHandle(registrationSequenceId); } } if (_cache != null && registrationSequenceId != -1) { _cache.RegisterCacheNotificationDataFilter(type, discriptor.DataFilter, registrationSequenceId); } } discriptor.IsRegistered = true; discriptor.Handle = handle; return(true); }
/// <summary> /// TheadSafe and no locks internally /// </summary> /// <param name="key"></param> /// <param name="eventType">Should contain one type i.e. should not be used as a flag. /// Every EventType should be executed from another thread</param> /// <param name="item"></param> /// <param name="oldItem"></param> /// <param name="reason"></param> /// <param name="_notifyAsync"></param> /// <param name="eventhandle"></param> internal void RaiseSelectiveCacheNotification(string key, EventType eventType, EventCacheItem item, EventCacheItem oldItem, CacheItemRemovedReason reason, bool _notifyAsync, EventHandle eventhandle, EventDataFilter dataFilter) { try { ResourcePool poolID = null; CacheEventArg arg = null; var bitSet = new BitSet(); if (_cache.SerializationFormat == Common.Enum.SerializationFormat.Json) { bitSet.SetBit(BitSetConstants.JsonData); } if (item != null) { item.SetValue(_cache.SafeDeserialize <object>(item.GetValue <object>(), _cache.SerializationContext, bitSet, UserObjectType.CacheItem)); } if (oldItem != null) { oldItem.SetValue(_cache.SafeDeserialize <object>(oldItem.GetValue <object>(), _cache.SerializationContext, bitSet, UserObjectType.CacheItem)); } if ((eventType & EventType.ItemUpdated) != 0) { poolID = _selectiveUpdateEventIDPool; } else if ((eventType & EventType.ItemRemoved) != 0) { poolID = _selectiveRemoveEventIDPool; } arg = CreateCacheEventArgument(dataFilter, key, _cacheName, eventType, item, oldItem, reason); if (poolID == null) { return; } CacheDataNotificationCallback callback = poolID.GetResource((short)eventhandle.Handle) as CacheDataNotificationCallback; if (callback == null) //Can occur if Unregistered concurrently { return; } if (_notifyAsync) { System.Threading.ThreadPool.QueueUserWorkItem(waitC, new object[] { callback, key, arg }); //Faster and better } else { callback.Invoke(key, arg); } } catch (Exception ex) { if (_logger != null && _logger.IsErrorEnabled) { _logger.CriticalInfo(ex.ToString()); } } }