2013-06-14 23 views
6

Zajmuję aplet aby umożliwić przesyłanie FTP z webapp ...Apache Commons Net FTPClient przerwać File Store

Operacja wyślij działa poprawnie, ale chciałbym móc anulować plikiem przechowującym w postęp.

Nie jestem biegły w obsłudze wątków. Pierwszą próbą było wywołanie ftp.abort() w wątku anulowania, ale metoda abort została wywołana dopiero po zakończeniu metody storeFile, tak jak w przypadku, gdy wątek wysyłania blokował obiekt ftp.

Zmieniłem kod, aby przerwać wysyłanie wątku i sprawdzić go w odbiorniku strumienia kopii. Przechowywanie plików zatrzymuje się zgodnie z oczekiwaniami, ale wywołanie ftp.abort() zawiesza aplikację, nigdy nie jest kompletne.

Wszelkie pomysły?

Dzięki Philip

Wysłać operacja:

botaoEnviar.setEnabled(false); 
    botaoCancelar.setEnabled(true); 
    textField.requestFocus(); 

    threadEnvio = new Thread(new Runnable() 
    { 
    @Override 
    public void run() 
    {    
     FileInputStream fis = null; 
     try 
     { 
      if(arquivoSelecionado == null) 
      { 
       throw new IllegalArgumentException("Arquivo deve ser informado"); 
      } 

      try 
      { 
       ftp = new FTPClient(); 
       ftp.connect("192.168.1.243"); 
      } 
      catch(Exception e) 
      { 
       throw new FtpConnectionException("Não foi possível conectar no servidor FTP", e); 
      } 

      if(!ftp.login("c001", "0AJF2J36")) 
      { 
       throw new IllegalArgumentException("Não foi possível autenticar no servidor FTP"); 
      } 

      ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 

      ftp.setCopyStreamListener(new CopyStreamAdapter() 
      {     
       @Override 
       public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) 
       { 
       if(threadEnvio.isInterrupted()) 
       { 
        try 
        { 
         ftp.abort();       
        } 
        catch(IOException ex) 
        { 
         handleException(ex); 
        } 
       } 
       else 
       { 
        int percent = (int) (totalBytesTransferred * 100/arquivoSelecionado.length()); 
        progressBar.setValue(percent); 
       } 
       } 
      }); 

      fis = new FileInputStream(arquivoSelecionado);    
      if(ftp.storeFile(arquivoSelecionado.getName(), fis)) 
      { 
       JOptionPane.showMessageDialog(null, "Arquivo enviado com suceso"); 
      } 
      else 
      { 
       JOptionPane.showMessageDialog(null, "Não foi possível enviar o arquivo", "Erro", JOptionPane.ERROR_MESSAGE); 
      } 

      ftp.logout(); 
     }    
     catch(Exception e) 
     { 
      handleException(e); 
     } 
     finally 
     { 
      if(fis != null) 
      { 
       try 
       { 
       fis.close(); 
       } 
       catch(IOException ex) 
       { 
       handleException(ex); 
       } 
      } 

      if(ftp != null) 
      { 
       try 
       { 
       ftp.disconnect(); 
       } 
       catch(IOException ex) 
       { 
       handleException(ex); 
       } 
      } 

      progressBar.setValue(0); 
      botaoEnviar.setEnabled(true);    
      botaoCancelar.setEnabled(false);    
     } 
    } 
    }); 
    threadEnvio.start(); 

Anuluj Operacja:

botaoCancelar.setEnabled(false); 

    new Thread(new Runnable() 
    { 
    @Override 
    public void run() 
    { 
     try 
     {    
      threadEnvio.interrupt(); 
     } 
     catch(Exception ex) 
     { 
      handleException(ex); 
     } 
     finally 
     { 
      botaoCancelar.setEnabled(true);    
     } 
    } 

    }).start(); 
+0

Tak Byłoby miło, gdyby sieć FTP FTPClient miał API, aby przerwać transfer, na przykład za pomocą słuchacza do kopiowania, gdzie można zwrócić wartość boolean jako false, aby przerwać transfer. –

+4

Zamiast myśleć w kategoriach przerywania wątku, spróbuj uczynić ftp = new FTPClient() dostępnym. Kiedy użytkownik kliknie przycisk Anuluj, dodaj zdarzenie do przycisku, który dostanie ftp i uruchom metodę [abor()] (http://commons.apache.org/proper/commons-net/javadocs/api- 3.3/org/apache/commons/net/ftp/FTP.html # abor()) w instancji ftp. – vianna77

Odpowiedz

0

przerywania wątku, jak to nie jest prawda i spowodować oczekiwanie wątku przez kilka sekund (a nawet millis) w dokładnie tej linii, która współ mpiler czyta w wątku
jedyny sposób, aby można było przerwać przesyłanie ftp czyni SLEEP gwint jakiś czas, a następnie przerwać swoją przesyłanie i po wszystkim czekać na wątku, aby zakończyć sobie
zobaczyć to:

try { 
      try { 
        Thread.currentThread(); 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

      try { 
        mFTP.abort(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
    } catch (NetworkOnMainThreadException e) { 

    }