我们实施了Lucene.NET来处理我们服务器中主题标签的搜索。该实现是在Windows Azure辅助角色中完成的。
我们基于Leon Cullens在他的博客中提供的示例,您可以看到here。索引器将索引文档写入Windows Azure存储。
当我们将其发布到Windows Azure时,第一次创建索引器时一切都很好,但我们之后不会更新索引器。
当我们在本地测试时,线程会在第一次正常睡眠和唤醒,但有时会第二次抛出异常:
An unhandled exception of type 'Microsoft.WindowsAzure.Storage.StorageException' occurred in Microsoft.WindowsAzure.Storage.dll
Additional information: The remote server returned an error: (412)
There is currently a lease on the blob and no lease ID was specified in the request..
根据我们的猜测,当存储被覆盖时会发生这种情况。我们是否需要指定其他内容?
我们在向Azure发布时遇到了上一个问题,因为我们需要指定一个RAMDirectory对象,因此无法创建索引器。我们将代码更改为:
Microsoft.WindowsAzure.Storage.CloudStorageAccount cloudStorageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.DevelopmentStorageAccount;
Microsoft.WindowsAzure.Storage.CloudStorageAccount.TryParse(CloudConfigurationManager.GetSetting("ConnectionStringAzureSearch"), out cloudStorageAccount);
AzureDirectory azureDirectoryExample = new AzureDirectory(cloudStorageAccount, "indexsearch", new Lucene.Net.Store.RAMDirectory());
这可能是相关的吗?从412响应代码中,我们只能在尝试重新创建索引器时猜出“失踪”。
我们是否需要调用某种更新函数,因为重新创建索引器可能是一种错误的方法?
答案 0 :(得分:0)
我们发现了问题。
在我们的worker角色中,我们在while循环之外创建了一个Indexer类的实例。
这不仅使得索引器不会使用新条目进行更新,而且还会导致工作者角色崩溃。当我们删除存储空间中的旧条目时,引用可能指向不再存在的地方。