Apache Ignite:如何获取指定缓存的CacheObjectPut与CacheObjectRemoved事件
Ignite指定单缓存事件监听解决方案
你当前使用全局Ignite.GetEvents()监听的方式会接收所有缓存的事件,要过滤仅获取指定缓存的对应事件,有两种实现方式:
方案1(推荐):使用连续查询(Continuous Query)监听目标缓存
该方式在服务端就会完成事件过滤,仅推送目标缓存的事件到客户端,性能更高,是官方推荐的单缓存事件监听方案:
// 全局配置依旧需要开启对应事件,这是事件触发的前置要求 var cfg = new IgniteConfiguration { IncludedEventTypes = new[] { EventType.CacheObjectPut, EventType.CacheObjectRemoved, } }; var ignite = Ignition.Start(cfg); // 替换为你需要监听的缓存名称 var targetCache = ignite.GetCache<object, object>("你的目标缓存名"); // 配置连续查询,监听缓存变更事件 var continuousQuery = new ContinuousQuery<object, object>( new CacheEntryEventListener<object, object>(eventList => { foreach (var entryEvent in eventList) { switch (entryEvent.EventType) { case CacheEntryEventType.Created: case CacheEntryEventType.Updated: // 对应CacheObjectPut事件的处理逻辑 Console.WriteLine($"写入事件:键={entryEvent.Key}, 值={entryEvent.Value}"); break; case CacheEntryEventType.Removed: // 对应CacheObjectRemoved事件的处理逻辑 Console.WriteLine($"删除事件:键={entryEvent.Key}"); break; } } }) ); // 启动监听 targetCache.QueryContinuous(continuousQuery);
方案2:全局监听增加缓存名过滤
如果你不想改动现有全局监听的代码结构,可以在本地监听器中增加缓存名判断,仅处理目标缓存的事件:
原有全局监听的启动代码不需要修改,只需调整LocalListener的实现:
public class LocalListener : IEventListener<CacheEvent> { // 替换为你需要监听的缓存名称 private const string TargetCacheName = "你的目标缓存名"; public bool Invoke(CacheEvent cacheEvent) { // 非目标缓存的事件直接跳过 if (cacheEvent.CacheName != TargetCacheName) { return true; } // 原有事件处理逻辑 if (cacheEvent.Type == EventType.CacheObjectPut) { // 处理写入事件 } else if (cacheEvent.Type == EventType.CacheObjectRemoved) { // 处理删除事件 } return true; } }
注意:两种方案都需要保证Ignite全局配置的
IncludedEventTypes中已经包含了你需要监听的事件类型,否则事件不会被Ignite触发。
内容的提问来源于stack exchange,提问作者csharpdev
相关产品推荐
相关产品推荐

