我有java进程1,它使用rpc来调用java进程2,它在映射的网络驱动器上创建一个文件。然后,进程1尝试读取该文件。通常文件读取正常,但有时它找不到文件,即使我可以看到它确实被创建。
进程1,2和映射的驱动器分别位于不同的Windows Server 2008计算机上。因此,这些进程位于不同的JVM和独立的操作系统上。
进程2在返回之前执行此类操作(意味着它确保在从rpc调用返回之前将文件写入磁盘):
FileOutputStream fileOut = new FileOutputStream(new File(pdfPath));
bufferedOut = new BufferedOutputStream(fileOut);
// write to file
bufferedOut.flush();
fileOut.getFD().sync();
bufferedOut.close();
在rpc方法调用返回后,进程1将尝试读取该文件。
我确信文件是在进程1尝试读取它之前编写的,但是在JVM或操作系统中发生了一些缓存,这阻止了进程检测到文件
在我尝试读取文件之前没有错误,它看起来像这样:
java.io.IOException: G:/mydir/my file ( 1.pdf not found as file or resource.
at com.itextpdf.text.pdf.RandomAccessFileOrArray.<init>(RandomAccessFileOrArray.java:113)
at com.itextpdf.text.pdf.RandomAccessFileOrArray.<init>(RandomAccessFileOrArray.java:80)
at com.itextpdf.text.pdf.PRTokeniser.<init>(PRTokeniser.java:112)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:169)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:159)
...
答案 0 :(得分:1)
根据halfbit的建议,我将这个答案用于类似的问题https://stackoverflow.com/a/9935126/669645,这解决了我的问题
解决方案是在所有计算机上禁用SMB2缓存。为此,我将以下DWORD记录添加到HKEY_LOCAL_MACHINE \ system \ CurrentControlSet \ Services \ LanmanWorkstation \ Parameters下的注册表中:
请注意。要修改注册表,您需要打开注册表编辑器:在开始菜单的搜索框中键入“regedit”并运行regedit.exe
可在以下链接中找到更多信息: