从machine2更改键值后,未从Machine1获取更改的值

时间:2014-09-29 12:34:40

标签: appfabric

我做了一个示例应用程序&从两台应用程序正在使用AppFabric缓存的两台不同计算机上运行该应用程序。我在两个应用程序配置文件中使用以下设置设置pollInterval =“120”秒:

<localCache isEnabled="true" 
            sync="NotificationBased" 
            ttlValue="300" 
            objectCount="10"/>

<!--(optional) specify cache notifications poll interval-->
<clientNotification pollInterval="120" /> 

还使用powershell在群集中启用通知。

现在从Machine1我读到名为key1的键,其值为“Value1” 然后从Machine2我将key1的值更改为“Changed” 然后从Machine2我读到了名为key1的键,其值现在显示为“已更改” 然后在轮询间隔周期(2 mnts)之后,我从Machine1读取名为key1的键,其值现在仍显示为“Value1”。为什么它没有显示“已更改”。

为什么Machine1中的应用程序未检测到更改?为什么没有发生本地缓存失效?

在Ahmed Ilyas:&gt; 显示您用于读取和写入缓存的代码。您还没有解释如何配置AppFabric和这些机器。他们加入了集群吗?

我已经通过AFC Read-Through API阅读了。这是在单独的项目中完成的。写入缓存仅通过Put()方法完成。由于这是一个示例项目,因此我无需更新数据库,只更新缓存集群。

在2台计算机上运行的每个应用程序的上述配置设置。 我允许通过在缓存集群中授予对这两台计算机的访问权限来访问这两台计算机。 1台机器既是AFC服务器又是缓存客户端(即Machine1)。

希望这可以帮助您回答。找到以下代码:

public class CacheUtil

{

private static DataCacheFactory _factory = null;
    private static DataCache _cache = null;
static CacheUtil()
{
  if (_cache == null)
  {
    // Declare array for cache host(s).
    DataCacheServerEndpoint[] servers = new DataCacheServerEndpoint[1];
    servers[0] = new DataCacheServerEndpoint("H1011.hoboo.net", 22233);
    // Set the local cache properties. In this example, it
    // is timeout-based with a timeout of 300 seconds(5mnts).
    DataCacheLocalCacheProperties localCacheConfig;
    TimeSpan localTimeout = new TimeSpan(0, 5, 0);

    localCacheConfig = new DataCacheLocalCacheProperties(60, localTimeout, DataCacheLocalCacheInvalidationPolicy.TimeoutBased);
    // Setup the DataCacheFactory configuration.
    DataCacheFactoryConfiguration factoryConfig = new DataCacheFactoryConfiguration();
    //factoryConfig.ChannelOpenTimeout = new TimeSpan(0, 0, 0);
    //factoryConfig.Servers = servers;
    //factoryConfig.LocalCacheProperties = localCacheConfig;

    _factory = new DataCacheFactory();
    //_factory = new DataCacheFactory(factoryConfig);
    _cache = _factory.GetCache("default");
  }


}

public static DataCache GetCache()
{
  if (_cache != null) return _cache;

  try
  {
    RuntimeContext.WriteAppFabricErrorLog(new AppFabricLogger()
    {
      CacheKey = "Connected to AppFabric Cache Server.",
      CacheData = "Connected to AppFabric Cache Server.",
      ErrorString = "Connected to AppFabric Cache Server."
    });
  }
  catch (Exception ex)
  {
    //Suppress Error
  }
  return _cache;
}

}

其他有Get()的类:&gt;

    public static object Get(string pName)
{
  object cachedItem = null;
  try
  {
    //Check configuration settings for AppFabric.
    bool appFabricCache;
    bool.TryParse(System.Configuration.ConfigurationManager.AppSettings["AppFabricCache"], out appFabricCache);
    if (appFabricCache)
    {
      //Get data from AppFabric Cache Server.
      cachedItem = CacheUtil.GetCache().Get(pName);
    }
    else
    {
      //Get data from Local Cache Server.
      cachedItem = RuntimeContextOlderVersion.Get(pName);
    }
  }
  catch (Exception Ex)
  {
    //If failes, write reason to log file.
    WriteAppFabricErrorLog(new AppFabricLogger()
    {
      CacheKey = pName,
      CacheData = "Get Method",
      ErrorString = Ex.ToString()
    });
  }
  return cachedItem;
}
  

@stuartd

是的,我已启用通知。你可以在我的appconfig中看到它。

Staurt:&gt;

PS C:\ Windows \ system32&gt;得到-cacheconfig

命令管道位置1处的cmdlet Get-CacheConfig 提供以下参数的值: CacheName:默认

CacheName:默认
TimeToLive:10分钟
CacheType:分区
辅助人员:0
MinSecondaries:0
IsExpirable:真实的 EvictionType:LRU
NotificationsEnabled:正确 WriteBehindEnabled:False
WriteBehindInterval:300
WriteBehindRetryInterval:60
WriteBehindRetryCount:-1
ReadThroughEnabled:正确 ProviderType:SampleProvider.Provider,SampleProvider,Version = 1.0。                            0.0,Culture = neutral,PublicKeyToken = cde85af3c5f6411                            Ë
ProviderSettings:{“DBConnection”=“Database = Test123; Server = 。**。                            **; uid = ****; pwd = *****;连接超时= 5000“}

0 个答案:

没有答案