2013-03-11 59 views
1

我目前正在编写一个Java EE应用程序来使用Lucene搜索索引。如何刷新java中网络名称的分辨率?

我的应用程序驻留在Windows机器上的Tomcat服务器上,索引数据位于另一台机器上。

有时(显然是随机的),网络名称变得无法访问。

这是例外,我得到:

12:29:39.011 [ajp-8039-5] ERROR o.f.c.d.p.viewmodel.PilotViewModel - The specified network name is no longer available: SimpleFSIndexInput(path="\\INDEXFILEPATH\indexfile.ext") 
java.io.IOException: The specified network name is no longer available: SimpleFSIndexInput(path="\\INDEXFILEPATH\indexfile.ext") 
at org.apache.lucene.store.SimpleFSDirectory$SimpleFSIndexInput.readInternal(SimpleFSDirectory.java:140) ~[lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12] 

下面是相关的代码。抛出的例外情况如下FSDirectory.open

private void addReaderForRegistry(String indexDirectoryPath, List<IndexReader> readers) throws IOException{ 

    File indexFolder = new File(indexDirectoryPath); 

    if (!(indexFolder.exists() || !(indexFolder.isDirectory()))) { 
      throw new IOException(indexFolder.getName() + "is not a valid index location"); 
    }else{ 

     // search for subfolders 
     List<String> subfolders = FileSystemHelper.listDirectories(indexFolder.getAbsolutePath()); 

     if(subfolders.isEmpty()){ 
      Directory fsDirectory = FSDirectory.open(indexFolder); 
      IndexReader reader = IndexReader.open(fsDirectory); 
      readers.add(reader);     
     } 
    } 
} 

我确定服务器已启动。

要解决这个问题,我必须重新启动Tomcat应用程序服务器。有什么我可以做一些错误恢复吗?

请注意,每个请求都打开FSDirectory,因此简单的bean重新初始化不起作用。

谢谢。

编辑:这里是一个更完整的堆栈跟踪

java.io.IOException: The specified network name is no longer available: SimpleFSIndexInput(path="\\hqwprceb1\DRMS-STRUCTURE\indexes_ready\AG\_o48.nrm") 
at org.apache.lucene.store.SimpleFSDirectory$SimpleFSIndexInput.readInternal(SimpleFSDirectory.java:140) ~[lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12] 
at org.apache.lucene.store.BufferedIndexInput.readBytes(BufferedIndexInput.java:156) ~[lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12] 
at org.apache.lucene.index.SegmentNorms.bytes(SegmentNorms.java:164) ~[lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12] 
at org.apache.lucene.index.SegmentReader.norms(SegmentReader.java:575) ~[lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12] 
at org.apache.lucene.search.TermQuery$TermWeight.scorer(TermQuery.java:107) ~[lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12] 
at org.apache.lucene.search.BooleanQuery$BooleanWeight.scorer(BooleanQuery.java:298) ~[lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12] 
at org.apache.lucene.search.ConstantScoreQuery$ConstantWeight.scorer(ConstantScoreQuery.java:145) ~[lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12] 
at org.apache.lucene.search.BooleanQuery$BooleanWeight.scorer(BooleanQuery.java:298) ~[lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12] 
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:577) ~[lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12] 
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:383) ~[lucene-core-3.6.1.jar:3.6.1 1362471 - thetaphi - 2012-07-17 12:40:12] 
+0

虽然DNS名称完全是为了这个目的,但由于这个问题,在这些情况下(大多数情况下固定基础架构,不会频繁更改),我宁愿直接使用IP地址,而忽略游戏中的DNS ... – ppeterka 2013-03-11 09:31:33

+0

Bonjour/zeroconf会成为一个选项吗?然后参考“server.local”。 – 2013-03-11 09:49:02

+0

我会试着用ip地址。不幸的是,bonjour/zerconf不是一个选项。不管怎么说,还是要谢谢你。 – 2013-03-11 10:44:29

回答

0

我有一个类似的问题(有时丢失后来自动回来的网络驱动器中,IndexSearcher的没有从此一蹶不振)。

的解决方法是赶上IndexSearcher的#搜索调用的很少存在的IOException异常,然后放到这个IndexSearcher的实例(设置基准以它为null)。下一个请求会懒惰地创建一个新的IndexSearcher实例(也可能会失败),希望网络驱动器现在可用。系统迟早会恢复自身。

我利用Lucene 3.5,JDK 1.6和Windows 7

如果有人知道一个更好的解决方案 - >感谢指向它。

+0

用于调试目的我为每个查询创建一个新的索引读取器。它不起作用,因为在创建IndexSearcher的Reader实例期间引发异常。不管怎么说,还是要谢谢你。 – 2013-05-02 09:34:58