最近在调查测试中的一个错误, 是这样的, jsp compiler如果设置forceGeneration的话,则不管jsp是否改变,都应该重新生成class文件.
但在linux上就时不时case会fail. 即两次生成的文件的timestamp相同了.
跟踪code发现确实做了写class文件这个动作. 也就是说jsp compiler的逻辑没问题.
于是做了这么一个实验
这个程序在Windows下能一直运行下去, 就是说两次文件的lastmodify的timestamp不同, 但在linux下则很快就停下来了.
但如果把那个Thread.sleep改成3000的话, 就可以一直run了.
开始觉得是文件没有flush, 但加了flush也没有改变.
看来问题是在sleep上, 也许是因为在linux上, java的Thread.sleep太不精确, 而这个写文件操作也比较快, 所以就没怎么sleep就进行了第二次文件写操作, 从而使两次timestamp相同.
但这个不好验证. 还不能确定是否根本原因.
但在linux上就时不时case会fail. 即两次生成的文件的timestamp相同了.
跟踪code发现确实做了写class文件这个动作. 也就是说jsp compiler的逻辑没问题.
于是做了这么一个实验
java 代码
- package robin.test;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- public class FileTimeExam {
- private static final String FILENAME = "C:/1.txt";
- public static void main(String[] args) throws InterruptedException {
- int n = 1;
- while (true) {
- System.out.println("=== n="+n+" ===");
- File f1 = new File(FILENAME);
- writeFile(f1);
- long t1 = f1.lastModified();
- System.out.println("t1=" + t1);
- Thread.sleep(300);
- File f2 = new File(FILENAME);
- writeFile(f2);
- long t2 = f2.lastModified();
- System.out.println("t2=" + t2);
- if (t1 == t2) {
- System.out.println("time is the same");
- return;
- }
- n++;
- }
- }
- public static void writeFile(File f) {
- try {
- OutputStream o = new FileOutputStream(f);
- o.write(10);
- o.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
这个程序在Windows下能一直运行下去, 就是说两次文件的lastmodify的timestamp不同, 但在linux下则很快就停下来了.
但如果把那个Thread.sleep改成3000的话, 就可以一直run了.
开始觉得是文件没有flush, 但加了flush也没有改变.
看来问题是在sleep上, 也许是因为在linux上, java的Thread.sleep太不精确, 而这个写文件操作也比较快, 所以就没怎么sleep就进行了第二次文件写操作, 从而使两次timestamp相同.
但这个不好验证. 还不能确定是否根本原因.