2013-06-14 14 views
6

Sto sviluppando un applet per consentire upload FTP da una webapp ...Apache Commons Net FTPClient interrompere archivio di file

L'operazione di invio sta lavorando bene, ma mi piacerebbe in grado di annullare un file memorizzazione in progresso.

Non sono molto fluente con i thread. Il mio primo tentativo è stato chiamare ftp.abort() nel thread cancel, ma il metodo abort è stato chiamato solo quando il metodo storeFile è terminato, come se il thread di invio stesse bloccando l'oggetto ftp.

Così ho cambiato il codice per interrompere il thread di invio e controllarlo nel listener del flusso di copie. La memorizzazione dei file si interrompe come previsto, ma la chiamata a ftp.abort() blocca l'applicazione, non viene mai completata.

Qualche idea?

Grazie, Philip

operazione di invio:

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(); 

Annulla operazione:

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

Sì Sarebbe bello se la rete pubblica FTPClient avesse l'API per interrompere un trasferimento, ad esempio utilizzando il listener di copia, in cui è possibile restituire un valore booleano come falso per interrompere il trasferimento. –

+4

Invece di pensare in termini di interruzione del thread, prova a rendere accessibile ftp = new FTPClient(). Quando l'utente fa clic sul pulsante Annulla, aggiunge un evento a quel pulsante che otterrà l'ftp ed eseguirà il metodo [abor()] (http://commons.apache.org/proper/commons-net/javadocs/api- 3.3/org/apache/commons/net/ftp/FTP.html # abor()) sull'istanza ftp. – vianna77

risposta

0

interrompere un thread come questo non è vero e causare la vostra attesa filo per alcuni secondi (o anche millis) esattamente a quale linea che co mpiler sta leggendo nel tuo thread
l'unico modo che si può interrompere il caricamento ftp sta facendo il sonno filo po 'di tempo e poi interrompere il caricamento e dopo tutto attendere il filo di completarsi
vedono questo:

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

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

    }