Как разработать класс и его метод - PullRequest
1 голос
/ 02 декабря 2011

Несколько клиентов отправляют запрос на запись файла и ожидают, что ответ либо успешный, либо неудачный.Я хотел бы кратко описать работу, проделанную на стороне сервера.

  1. обрабатывает запрос по классу сервлета и вызывает другой класс для продолжения.
  2. 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
     }
    

    }

Как вы можете видеть выше вкласс, в котором есть один метод, synchronized и два метода private.только synchrnized метод вызывается из servlet class другие методы вызываются внутри метода.так это хороший / стандартный способ обработки запросов нескольких клиентов?

или я должен вызывать каждый метод непосредственно из servlet class.Пожалуйста, поправьте меня и предложите лучший способ реализации класса.

@ Редактировать: req1 приходит и создает каталог и файл, например, context/directory_1/file_1.txt

в то же время req2 приходит и проверяетчто directory_1 уже существует, поэтому он создает directory_2, например, context/directory_2/file_1.txt.

, теперь вторым шагом является копирование файла из контекста во вновь созданный каталог.Позвольте мне сказать вам, directory_1 не имеет ничего общего с directory_2. Все недавно созданные каталоги копируют файл из общего_каталога, например `context / common_directory / ... в context / directory_1, context / directory_2 '

и третий шаг - сжатие каталога: например, directory_1.zip, directory_2.zip

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Два совета:

  1. Не называйте класс таким же, как уже существующий класс в JDK.

  2. Не объединяйте вызовы методов таким образом, создавайте одноцелевые методы, а затем объединяйте их в один метод, ясно показывающий вашу цель.

    class FileProcessor / * FileUtil независимо от, но не FileWriter * / {

    публичный синхронизированный writeFile (String contextPath) {// создайте каталог и новый файл в контексте

    copyFiles (contextPath);compressDir (contextPath);// для сжатия файла
    }

    // копирует файлы в / contextPath / directory / ... из существующихDirectory;
    private void copyFiles (String path_to_directory) {}

    // сжимаем вновь созданный каталог private void compressDir (String Directory_path) {}

1 голос
/ 02 декабря 2011

Если посмотреть на приведенный выше код, если вы вызываете writeFile из сервлета, ваш сервлет становится однопоточным приложением.

Если два работают над двумя отдельными каталогами и отдельными файлами, и вы гарантируете, что нет перекрытия, вы должны вызывать оба метода напрямую и использовать ditch synchronized.Похоже, такова твоя ситуация.Таким образом, вы можете использовать следующий подход:

Servlet Code

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

Теперь вся идея заключается в создании имени uniq dir.В настоящее время существует множество подходов для создания имени uniq dir.Я буду использовать тот, который основан на отметке времени.

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, и он атомарный и возвращает true, только если он способен создать уникальный каталог.Этот soln оптимизирован, так как запросы на коллизии в течение миллисекунды намного меньше, и нам не нужны какие-либо накладные расходы на синхронизацию.

Вы также можете использовать counter для создания уникального имени.Но если ваш счетчик всегда запускается с самого начала (то есть вы не поддерживаете его состояние в поточно-ориентированном режиме), то у вас возникают проблемы с производительностью / точностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...