internal void ActivateSilentListeners() { lock (_listeners.SyncRoot) { try { IDictionaryEnumerator listnersDic = _silentListeners.GetEnumerator(); while (listnersDic.MoveNext()) { DependencyListener listener = (DependencyListener)listnersDic.Value; listener.Initialize(); lock (_listeners.SyncRoot) { _listeners[listener.CacheKey] = new ArrayList().Add(listener); } } _silentListeners.Clear(); } catch (Exception) { if (_context.NCacheLog.IsErrorEnabled) { _context.NCacheLog.Error("YukonDependencyManager", "silent Listeners Activated. Listeners: " + _listeners.Count + " SilentListeners: " + _silentListeners.Count); } } } if (_context.NCacheLog.IsErrorEnabled) { _context.NCacheLog.Error("YukonDependencyManager", "silent Listeners Activated. Listeners: " + _listeners.Count + " SilentListeners: " + _silentListeners.Count); } }
/// <summary> /// /// </summary> /// <param name="key"></param> public void Remove(string key) { ArrayList _dblistner = (ArrayList)_listeners[key]; DependencyListener depLisner; lock (_listeners.SyncRoot) { if (_dblistner != null) { for (int i = 0; i < _dblistner.Count; i++) { depLisner = _dblistner[i] as DependencyListener; if (depLisner != null) { depLisner.Stop(); } } } _listeners.Remove(key); depLisner = null; } lock (_silentListeners.SyncRoot) { DependencyListener listener = (DependencyListener)_silentListeners[key]; if (listener != null) { _silentListeners.Remove(key); listener = null; } } }
public void OnDependencyChanged(DependencyListener sender, string cacheKey, bool changed, bool restart, bool error, bool invalid) { lock (AsyncOnDependencyChange.Queue) { AsyncOnDependencyChange.Queue.Enqueue(new DependencyListnerInformation(cacheKey, changed, restart, error, invalid, sender)); Monitor.Pulse(AsyncOnDependencyChange.Queue); } }
public DependencyListnerInformation(string cacheKey, bool change, bool restart, bool error, bool invalid, DependencyListener listner) { _cacheKey = cacheKey; _change = change; _restart = restart; _invalid = invalid; _error = error; _listner = listner; }
/// <summary> /// /// </summary> /// <param name="key"></param> public void RemoveWithoutStop(string key) { lock (_listeners.SyncRoot) { ArrayList _dblistner = (ArrayList)_listeners[key]; if (_dblistner != null) { _listeners.Remove(key); _dblistner = null; } } lock (_silentListeners.SyncRoot) { DependencyListener listener = (DependencyListener)_silentListeners[key]; if (listener != null) { _silentListeners.Remove(key); listener = null; } } }
/// <summary> /// Create and initialize dependency listener and Add it to the listener list and /// </summary> /// <param name="key">key used to reference object</param> /// <param name="connString">connection string used to connect to database</param> /// <param name="queryString">query string for which dataset is created to be monitored</param> /// <param name="doInitialize"></param> /// <param name="hintType"></param> /// <returns></returns> public bool Add(string key, string connString, string queryString, bool doInitialize, ExpirationHintType hintType) { DependencyListener listener = null; if (hintType == ExpirationHintType.OracleCacheDependency) { #if NET40 string fullAssemblyName = "Alachisoft.NCache.RuntimeDependencies, Version=" + Assembly.GetExecutingAssembly().GetName().Version; System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(fullAssemblyName); Type factoryType = assembly.GetType("Alachisoft.NCache.RuntimeDependencies.DependencyListenerFactory"); Object[] oDLArgs = new Object[7]; oDLArgs[0] = key; oDLArgs[1] = connString; oDLArgs[2] = queryString; oDLArgs[3] = this; oDLArgs[4] = this; oDLArgs[5] = _context.NCacheLog; oDLArgs[6] = hintType; Object dLFactory = Activator.CreateInstance(factoryType); MethodInfo dLFactoryCreateMethod = factoryType.GetMethod("Create"); listener = (DependencyListener)(dLFactoryCreateMethod.Invoke(dLFactory, oDLArgs)); #else return(true); #endif } else if (hintType == ExpirationHintType.SqlYukonCacheDependency) { if (hintType == ExpirationHintType.SqlYukonCacheDependency) { listener = new YukonDependencyListener(key, connString, queryString, _context, hintType); } else if (hintType == ExpirationHintType.NosDBCacheDependency) { listener = new NosDBDependencyListener(key, connString, queryString, _context, hintType); } } if (doInitialize) { listener.Initialize(); lock (_listeners.SyncRoot) { if (!_listeners.Contains(listener.CacheKey)) { ArrayList _dblistner = new ArrayList(); _dblistner.Add(listener); _listeners[listener.CacheKey] = _dblistner; } else { ArrayList _dblistner = (ArrayList)_listeners[listener.CacheKey]; _dblistner.Add(listener); _listeners[listener.CacheKey] = _dblistner; } } } else { lock (_silentListeners.SyncRoot) { _silentListeners[listener.CacheKey] = listener; } } return(true); }
private void Run() { while (!this._isThreadStopped) { lock (this.Queue) { if (this.Queue.Count == 0) { Monitor.Wait(this.Queue, 3000); } if (this._isThreadStopped) { break; } if (this.Queue.Count == 0) { if (!_trimToSize) { continue; } this.Queue.TrimToSize(); this._trimToSize = false; continue; } if (this.Queue.Count > 100) { this._trimToSize = true; } } DependencyListnerInformation instance = null; lock (this.Queue) { instance = this.Queue.Dequeue() as DependencyListnerInformation; if (instance == null) { continue; } } try { DependencyListener depListner = instance.Listner; if (instance.isChanged || instance.isRestart || instance.isError) { if (_notificationManager._context.CacheImpl != null) { CacheEntry entry = _notificationManager._context.CacheImpl.Get(instance.CacheKey, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation)); if (entry != null && entry.ExpirationHint != null && entry.ExpirationHint.NeedsReSync && _notificationManager._context.DsMgr != null) { _notificationManager._context.DsMgr.ResyncCacheItemAsync(instance.CacheKey, entry.ExpirationHint, null, entry.GroupInfo, entry.QueryInfo, entry.ResyncProviderName); } else { _notificationManager._context.NCacheLog.Info("DependencyListener.OnDependencyChanged", String.Format("Removing {0} ", instance.CacheKey)); CacheEntry ent = _notificationManager._context.CacheImpl.Remove(instance.CacheKey, ItemRemoveReason.DependencyChanged, true, null, 0, LockAccessType.IGNORE_LOCK, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation)); if (ent != null) { _notificationManager._context.CacheImpl.RemoveCascadingDependencies(instance.CacheKey, ent, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation)); } } lock (_notificationManager._context.ExpiryMgr.NotifBasedDepManager.NotifBasedDependencyListeners.SyncRoot) { _notificationManager._context.ExpiryMgr.NotifBasedDepManager.Remove(instance.CacheKey); } } } else if (instance.isInvalid) //This status is only sent by SQL Dependency { if (_notificationManager._context.CacheImpl != null) { CacheEntry entry = _notificationManager._context.CacheImpl.Get(instance.CacheKey, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation)); _notificationManager._context.NCacheLog.Error("DependencyListener.OnDependencyChanged", String.Format("Removing {0} because SQLDependency cannot be registered SqlNotificationEventArgs.Info is returned with Invalid status", instance.CacheKey)); CacheEntry ent = _notificationManager._context.CacheImpl.Remove(instance.CacheKey, ItemRemoveReason.DependencyInvalid, true, null, 0, LockAccessType.IGNORE_LOCK, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation)); if (ent != null) { _notificationManager._context.CacheImpl.RemoveCascadingDependencies(instance.CacheKey, ent, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation)); } if (ent != null && ((CacheEntry)ent).Value is CallbackEntry) { CallbackEntry cbEtnry = ((CacheEntry)ent).Value as CallbackEntry; if (cbEtnry != null && cbEtnry.ItemRemoveCallbackListener != null && cbEtnry.ItemRemoveCallbackListener.Count > 0) { _notificationManager._context.CacheInternal.NotifyCustomRemoveCallback(instance.CacheKey, cbEtnry, ItemRemoveReason.DependencyInvalid, true, null, null); } } lock (_notificationManager._context.ExpiryMgr.NotifBasedDepManager.NotifBasedDependencyListeners.SyncRoot) { _notificationManager._context.ExpiryMgr.NotifBasedDepManager.Remove(instance.CacheKey); } } } } catch (Exception exception) { _notificationManager._context.NCacheLog.Error("DependencyListener.OnDependencyChanged", exception.ToString()); } } }