超时时的AppFabric通知

时间:2011-10-06 08:36:02

标签: caching timeout 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”方法中放置了一个断点,但即使在10s超时(测试)之后也永远不会到达。 出于测试目的,我已明确调用

 m_cache.Remove(OrderId.Text); 

然后调用代表!

所以只有在我明确调用Remove函数时才调用delegate方法,但是如果超时到期则不会调用...

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

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

谢谢,

和Fabrice

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我认为你无法做到这一点,因为我认为回调机制并不是这样设计的。我可以看到你想要实现的目标,我可以看到你是如何得出这个问题的,但我认为只要你的客户端在任何地方使用缓存模式,你就会触及缓存,你会得到影响。

要进行审核,缓存旁边模式为:

  • 检查所需项目的缓存
  • 如果该项目不在缓存中
    • 获取项目(来自任何来源,例如数据库,网络服务)
    • 并将其放入缓存
    • 将项目返回给来电者
  • 如果项目IS在缓存中
    • (将其转换为预期类型)
    • 将项目返回给来电者

e.g。

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秒,因为如果它超出缓存,下一个调用者将从缓存中获得null结果并再次调用Web服务以从中获取订单网络服务。您将获得相同的效果,但由于缓存将按需填充,您应该会看到对服务器的影响较小,因为它不会每十秒钟启动一次Web服务请求。

答案 2 :(得分:0)

如果问题含义很深,我现在不知道,但如果某个项目在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(生存时间)结束后才会到来。我已经从微软证实了这一点。你应该稍等一下才能收到通知。