2013-03-11 30 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