AppFabric超时通知



我已经在AppFabric上启用了通知,我试图在添加期间指定的超时后从缓存中删除一个项目时获得通知。例:

TimeSpan timeout = new TimeSpan(0,0,10); 
m_cache.Add(OrderId.Text, order, timeout);
m_cache.AddItemLevelCallback(OrderId.Text,DataCacheOperations.RemoveItem,myCacheLvlDelegate);

我在"myCacheLvlDelegate"方法中放置了一个断点,但即使在10秒超时(测试)之后,它也从未达到。出于测试目的,我显式地调用了

 m_cache.Remove(OrderId.Text); 

之后,然后调用委托!

因此,只有当我显式调用Remove函数时才会调用委托方法,但如果超时超时则不会调用。

您是否有解决方案在超时后获得通知(添加期间指定的一个)?

我需要它,因为我想在超时后调用webservice来刷新数据并再次缓存结果。

谢谢你,

法布里斯

您真正需要的是以特定的间隔提醒您刷新Appfabric缓存项。

你可以尝试将AppFabric缓存与Microsoft Enterprise Library中的缓存块结合使用。缓存块使您能够在项目即将过期时收到通知。这将创建两个缓存。

在应用程序块提供的缓存中存储具有必要超时间隔的对象标识符,而您可以将实际数据"放入"AppFabric缓存中,而不需要超时间隔。使用"Put"而不是"Add"来确保如果对象存在,则替换它,否则创建它。

我不认为你能做到这一点,因为我不认为这种事情是回调机制设计的目的。我可以看到您想要达到的目的,也可以看到您是如何得出这个问题的,但我认为只要您的客户端在您触摸缓存的任何地方使用缓存-aside模式,您就会获得效果。

回顾一下,缓存旁模式是:
  • 检查所需项目的缓存
  • 如果项目不在缓存中
    • 获取项目(从任何来源,例如数据库,web服务)
    • 放到缓存
    • 将项目返回给调用者
  • 如果条目在缓存中
    • (将其转换为期望的类型)
    • 将项目返回给调用者

Order order;
// Check to see if the order is in the cache
Object cachedOrder = m_cache.Get(OrderId.Text);
if (cachedOrder == null)
{
    // The order is NOT in the cache, so get it from the web service
    order = OrderWebservice.Get(OrderId.Text);
    // Cache the order for 10 seconds
    m_cache.Add(OrderId.Text, order, New TimeSpan(0,0,10);
}
else
{
    // The order IS in the cache, so cast it
    order = (Order)cachedOrder;
}
// Return the order to the client, whether it's the cached order or the one from the web service
return order;

通过这种方式,缓存的订单不会超过10秒,因为如果缓存超时,下一个调用者将从缓存中获得空结果,并再次调用web服务以从web服务获取订单。您将获得相同的效果,但是由于缓存将按需填充,因此您应该看到对服务器的影响较小,因为它不会每十秒钟旋转一次web服务请求。

我不知道这个问题是否有深刻的含义,但是如果一个项目在appfabric中过期了,那么通知将在它过期后被检索。即使是项目级回调或缓存级回调。我的代码是

CustomDataCacheOperations.InsertIntoCache(myTestCache, txtKey.Text, InputTable.Text, 10);    
 ndCacheLvlAllOps = myTestCache.AddItemLevelCallback(txtKey.Text, allCacheOperations, myCacheLvlDelegate);

插入方法是

public static void InsertIntoCache(DataCache curCache, string Key, object value,int timeoutInSeconds)
    {
        if (curCache.Get(Key) == null)
            curCache.Add(Key, value,new TimeSpan(0,0,timeoutInSeconds));
        else
            curCache.Put(Key, value, new TimeSpan(0, 0, timeoutInSeconds));
    }

并且它适当地为所有操作提供通知。只有在项目从内存中被驱逐后才会发出过期通知,而不会在TTL(生存时间)结束时发出。我已经从微软那里确认了这一点。你应该等一会儿才能收到通知。

最新更新