如何设计课程&这是方法

时间:2011-12-02 08:59:40

标签: java architecture

多个客户端发送写入文件的请求,并期望响应成功或失败。我想简要描述在服务器端完成的工作。

  1. 通过servlet类处理请求并调用另一个类继续进行。
  2. 调用
  3. FileWriter类,此类执行文件写入过程 a)。 在上下文中创建目录并在目录中写入*.txt文件
    b)。 将上下文现有目录中的一些文件复制到新创建的目录中。
    c)。 压缩(*.zip)此目录

    class FileWriter {

    public synchronized writeFile(String contextPath) {
          creates a directory & new file under context
    
          copyFiles(path_to_directory);
    }
    
    private void copyFiles(String path_to_directory){
       copies files to /contextPath/directory/... from existingDirectory;  
    
     compressDir( Directory_path ); // to compress the file
     }
    
    private void compressDir(String Directory_path) {
           compress the newly created directory
     }
    

    }

  4. 正如您在课堂上看到的那样,有一种方法是synchronized,两种方法是private。只有synchrnized方法从servlet class调用其他方法从方法内部调用。 那么这是处理多个客户端请求的好/标准方法吗?

    或者我应该直接从servlet class调用每个方法。请纠正我并建议更好的方法来实施课程。

    @Edit: req1来创建目录&例如文件      context/directory_1/file_1.txt

    平均时间req2来检查directory_1是否已存在,以便创建directory_2,例如context/directory_2/file_1.txt

    现在第二步是将文件从上下文复制到新创建的目录。我告诉你directory_1directory_2无关  所有新创建的目录都从common_directory复制文件,例如`context / common_directory / ...到context / directory_1,context / directory_2'

    和第三步是压缩目录:例如directory_1.zip, directory_2.zip

2 个答案:

答案 0 :(得分:2)

两个建议:

  1. 不要将类命名为JDK中已存在的类。

  2. 不要以这种方式链接方法调用,然后创建一个用途的方法 把它们放在一起,清楚显示你的内涵。

    类FileProcessor / * FileUtil是什么,但不是FileWriter * / {

    public synchronized writeFile(String contextPath){   //创建一个目录&上下文中的新文件

    copyFiles(contextPath中);   compressDir(contextPath中); //压缩文件
    }

    //将文件从existingDirectory复制到/ contextPath / directory / ...;
    private void copyFiles(String path_to_directory){}

    //压缩新创建的目录 private void compressDir(String Directory_path){}

答案 1 :(得分:1)

查看上面的代码,如果从servlet调用writeFile,则servlet最终会成为单线程应用程序。

如果两个正在处理两个单独的目录和单独的文件,并且您保证没有重叠,则应该直接调用这两个方法并抛弃synchronized。看起来这就是你的情况。所以你可以使用以下方法:

Servlet Code

{
  ....
  String uniqDir = createUniqDir();
  copyFiles(uniqDir);
  compressDir(uniqDir);
}

现在整个想法是创建uniq目录名称。现在有很多方法可以创建uniq目录名称。我会使用一个基于时间戳的。

String createUniqDir() {
   // Use SimpleDateFormat or just millis from Date 
   // We just trying to be as uniq as possible.
  String timeStampStr;
  Date now = new Date();
  timeStampStr = "" + now.getTime(); // If using EPOC
  // This soln if you wana use SimpleDateFormat
  // SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
  // timeStampStr = sdf.format(dt);
  int counter = 1;

  String dirToCreateStr = "some_prefix-" + timeStampStr;
  File dirToCreate = new File(dirToCreate);

  while(!dirToCreate.mkdir()) {
    dirToCreateStr = "some_prefix-" + timeStampStr + "-" + counter;
    file = new File(dirToCreate);
    counter++;
  }
  return dirToCreateStr;
}

由于我们正在使用mkdir并且它是原子的,只有能够创建uniq目录才返​​回true。这个soln被优化为请求在毫秒内发生冲突的方式更少,我们不需要任何同步开销。

您也可以使用一些counter来创建uniq名称。但是,如果你的计数器总是从头开始(即你没有以线程安全的方式保持其状态),那么你就会遇到性能/准确性问题。