使用Lucene.NET创建的搜索索引器使用不会唤醒的工作者角色

时间:2014-06-03 23:54:48

标签: azure-storage lucene.net lucene azure-worker-roles

我们实施了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响应代码中,我们只能在尝试重新创建索引器时猜出“失踪”。

我们是否需要调用某种更新函数,因为重新创建索引器可能是一种错误的方法?

1 个答案:

答案 0 :(得分:0)

我们发现了问题。

在我们的worker角色中,我们在while循环之外创建了一个Indexer类的实例。

这不仅使得索引器不会使用新条目进行更新,而且还会导致工作者角色崩溃。当我们删除存储空间中的旧条目时,引用可能指向不再存在的地方。