java - 如何刷新java中网络名称的解析?

标签 java spring networking lucene

我目前正在编写一个 Java EE 应用程序来使用 Lucene 搜索索引。

我的应用程序驻留在 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]

最佳答案

我遇到了类似的问题(有时会丢失网络驱动器,但后来会自动恢复;IndexSearcher 无法从此恢复)。

我的解决方法是捕获很少发生的 IndexSearcher#search 调用的 IOException,然后删除此 IndexSearcher 实例(将对其的引用设置为 null)。下一个请求会懒惰地创建一个新的 IndexSearcher 实例(这也可能会失败),希望网络驱动器现在可用。系统迟早会自行恢复。

我使用 lucene 3.5、JDK 1.6 和 Windows 7。

如果有人知道更好的解决方案 -> 感谢您指出。

关于java - 如何刷新java中网络名称的解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15335021/

相关文章:

java - 如何在 java gui 中调整背景图像的大小?

java - 如何知道 Actor 完成了执行?

java - 如何配置多个数据库实例?

java - 我可以使用在 DispatcherServlet 上下文中声明的 Hibernate session 工厂而不是 hibernate.cfg.xml 吗?

Java 耦合 - 我应该跨不同模块依赖服务层还是存储库层?

c - Linux API 确定进程拥有的套接字

对象、数组和原始类型的 Java 和精确引用大小

java - restTemplate 删除与正文

performance - 推还是拉近乎实时的自动化服务器?

ios - 苹果是否允许在 iPhone 应用程序中使用 tcpdump