2013-06-14 8 views
6

मैं एक webapp से एफ़टीपी अपलोड करने की अनुमति के लिए एक एप्लेट विकासशील हूँ ...अपाचे कॉमन्स नेट FTPClient गर्भपात फ़ाइल दुकान

भेजने आपरेशन ठीक काम कर रहा है, लेकिन मैं एक फ़ाइल में संग्रहीत रद्द करने में सक्षम करना चाहते हैं प्रगति।

मैं थ्रेड के साथ बहुत धाराप्रवाह नहीं हूं। मेरा पहला प्रयास रद्द थ्रेड में ftp.abort() को कॉल करना था, लेकिन अपरोर्ट विधि केवल तभी कॉल की गई जब स्टोरफाइल विधि समाप्त हो गई, जैसे कि प्रेषण थ्रेड ftp ऑब्जेक्ट को लॉक कर रहा था।

इसलिए मैंने कोड को थ्रेड को बाधित करने और प्रतिलिपि स्ट्रीम श्रोता में जांचने के लिए कोड बदल दिया। फाइल भंडारण अपेक्षित के रूप में बंद हो जाता है, लेकिन ftp.abort() कॉल एप्लिकेशन को लटकता है, यह कभी पूरा नहीं होता है।

कोई विचार?

धन्यवाद, फिलिप

संदेश आपरेशन:

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

रद्द आपरेशन:

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

हाँ: mpiler अपने सूत्र में
एक ही रास्ता है कि आप को निरस्त कर सकते हैं अपने एफ़टीपी अपलोड धागा नींद कुछ समय बना रही है और फिर अपने अपलोड को रद्द कर और सब के बाद ही पूरा करने के लिए
यह देखने के लिए इंतजार धागा पढ़ रहा है अच्छा होगा अगर कॉमन्स नेट एफ़टीपी क्लाइंट के पास स्थानांतरण को रद्द करने के लिए एपीआई था, उदाहरण के लिए प्रतिलिपि श्रोता का उपयोग करके, जहां आप हस्तांतरण को रद्द करने के लिए झूठ के रूप में एक बुलियन लौट सकते हैं। –

+4

धागे को बाधित करने वाले शब्दों में सोचने के बजाय, ftp = new FTPClient() को सुलभ बनाने का प्रयास करें। जब उपयोगकर्ता रद्द करें बटन पर क्लिक करता है, तो उस बटन पर एक ईवेंट जोड़ें जो ftp प्राप्त करेगा और विधि [abor()] चलाएं (http://commons.apache.org/proper/commons-net/javadocs/api- 3.3/संगठन/apache/commons/net/ftp/FTP.html # abor()) ftp उदाहरण पर। – vianna77

उत्तर

0

इस तरह एक धागे में दखल सच नहीं है और अपने धागा इंतजार का कारण कुछ सेकेंड (या यहां तक ​​कि मिलिस) के लिए वास्तव में कौन सी रेखा सह

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

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

    } 
संबंधित मुद्दे