Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        /// <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());
                }
            }
        }