2016-03-22 10 views
1

Ich habe Java-Code mit denen ich E-Mails von Outlook Exchange Server herunterladen. Das Problem, mit dem ich konfrontiert bin, ist: Wenn die Internetverbindung unterbrochen ist, stoppt die Programmausführung.Überprüfung auf Internet-Konnektivität in Java

Ich möchte den Code auf Internetverbindung überprüfen, bis die Verbindung verfügbar ist. Ich möchte nicht, dass die Ausführung aufhört, wenn das Internet getrennt wird.

Einige Lösungen für die Überprüfung der Internetkonnektivität gibt es auf Stack-Überlauf, aber wenn ich diese Lösung verwende, bekomme ich nach einiger Zeit Stackoverflow-Fehler.

private static void checkNetConnectivity() 
{ 
    Socket sock = new Socket(); 
    InetSocketAddress addr = new InetSocketAddress("www.google.com",80); 
    try{ 
     sock.connect(addr,3000); 
     System.out.println("connected"); 
    }catch(Exception e){ 
     System.out.println("not connected"); 
    } 


} 

Ich bin die Methode aus der folgenden Funktionsaufruf:

public static void downloadEmails(String protocol, String host, String port, String username, String password) 
{ 
    Properties props = new Properties(); 
    Folder inbox = null; 

    MimeBodyPart bp = null; 
    String mail_subject = null, mail_body = null; 
    int i; 


    props.setProperty("mail.store.protocol", "imaps"); 
    //props.put("mail.pop3.host", host); 
    //props.put("mail.pop3.port", port); 
    //props.put("mail.pop3.starttls.enable", "true"); 
    try 
    { 
     do 
     { 
      checkNetConnectivity(); 
     Session session = Session.getInstance(props); 
     //session.setDebug(true); 
     Store store = session.getStore(protocol); 
     store.connect(host, username, password); 


     inbox = store.getFolder("INBOX"); 
     inbox.open(Folder.READ_WRITE);// READ_WRITE mode is compulsory if you want to set the SEEN flag. 


      cnt = 0; 
      Flags seen = new Flags(Flags.Flag.SEEN); 
      FlagTerm unseenFlagTerm = new FlagTerm(seen, false); 
      Message msg[] = inbox.search(unseenFlagTerm); 
      System.out.println("No of unseen messages : " + msg.length); 
      if (msg.length > 0) 
      { 
       for (i = 0; i < msg.length; i++) 
       { 
        System.out.println("Serial No :" + i); 
        Address[] in = msg[i].getFrom(); 
        for (Address address : in) 
        { 
         System.out.println("FROM:" + address.toString()); 
         //String mail_address = address.toString(); 
        } 
        System.out.println("SENT DATE: " + msg[i].getSentDate()); 
        System.out.println("SUBJECT: " + msg[i].getSubject()); 
        mail_subject = msg[i].getSubject(); 
        Date date = msg[i].getSentDate(); 
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 
        String mail_sent_date = df.format(date); 
        System.out.println("Sent date = "+ mail_sent_date); 


        String str1[] = mail_subject.split("\\|"); 
        int sub_delimiter_count = str1.length - 1; //count of delimiter for validating email subject 


        if (str1[0].equals("1001") && sub_delimiter_count == 3) 
        { 

         System.out.println("Subject line valid."); 

         Object content = msg[i].getContent(); 

         if (content instanceof String) 
         { 
          String body = (String) content; 
          mail_body = body; 

          boolean isValid = new ReadMail().ValidateMail(mail_body); 

          if(isValid) 
          { 
           System.out.println("Email body in proper format."); 
          } 
          else 
          { 
           System.out.println("Email not in proper format.\nIgnoring..."); 
           continue; 
          } 
         } 
         else if (content instanceof Multipart) 
         { 
          System.out.println("This is MultiPart"); 
          MimeMultipart mp = (MimeMultipart) msg[i].getContent(); 
          bp = (MimeBodyPart) mp.getBodyPart(0); 
          InputStream partInput = bp.getInputStream(); 
          mail_body = new Scanner(partInput, "UTF-8").useDelimiter("\\A").next(); 
         } 
         System.out.println("hhhh"); 
         ReadEmail(mail_subject, mail_body, mail_sent_date); 


        } 
        else 
        { 
         System.out.println("Subect not in required format.\nIgnoring..."); 
        } 
        msg[i].setFlag(Flags.Flag.SEEN, true); // for this to work INBOX or any FOLDER has to opened in READ_WRITE mode. 
       } 
      } else { 
       Date date = new Date(); 
       System.out.println("No new messages. Last checked: "+date.toString()); 
      } 

     try { 
      Thread.sleep(2000);     //1000 milliseconds is one second. 
     } catch(InterruptedException ex) { 
      Thread.currentThread().interrupt(); 
     } 
     store.close(); 
     }while(true); 

    }catch(Exception e) 
    { 
     e.printStackTrace(); 
     //downloadEmails(protocol,host,port,username,password); 
    } 

} 

Dies war die Ausnahme, die ich bekam, als Internet-Verbindung unterbrochen wurde:

javax.mail.MessagingException: Keine Route zum Host: verbinden; verschachtelte Ausnahme ist: java.net.NoRouteToHostException: Keine Route zum Host: verbinden bei com.sun.mail.imap.IMAPStore.protocolConnect (IMAPStore.java:670) DEBUG: setDebug: Java Mail Version 1.4.7 DEBUG: getProvider() Rückgabe javax.mail.Provider [Speichern, IMaps, com.sun.mail.imap.IMAPSSLStore, Oracle] DEBUG IMAPS: mail.imap.fetchsize: 16384 DEBUG IMAPS: mail.imap.ignorebybodysize: false DEBUG IMAPS: mail.imap.statuscachetimeout: 1000 DEBUG IMAPS: mail.imap.appendbuffersize: -1 DEBUG IMAPS: mail.imap.minidletime: 10 DEBUG IMAPS: versuchen, eine Verbindung zum Host "outlook.office365.com" herzustellen, Port 993, isSSL true

bei javax.mail.Service.connect (Service.java:295) bei javax.mail.Service.connect (Service.java:176) bei readmail.ReadMail.downloadEmails (ReadMail.java:200) bei readmail.ReadMail.main (ReadMail.java:323) verursacht durch: java.net.NoRouteToHostException: Keine Route zum Host: bei java.net.DualStackPlainSocketImpl.connect0 (native Methode) bei java.net.DualStackPlainSocketImpl.socketConnect verbinden (Unknown Source) bei java.net.AbstractPlainSocketImpl.doConnect (Unknown Source) bei java.net.AbstractPlainSocketImpl.connectToAddress (Unknown Source) bei java.net.AbstractPlainSocketImpl.connect (Unknown Source) bei java.net.PlainSo cketImpl.connect (Unbekannte Quelle) um java.net.SocksSocketImpl.connect (unbekannte Quelle) um java.net.Socket.connect (unbekannte Quelle) um java.net.Socket.connect (unbekannte Quelle) um com. sun.mail.util.SocketFetcher.createSocket (SocketFetcher.java:321) bei com.sun.mail.util.SocketFetcher.getSocket (SocketFetcher.java:237) bei com.sun.mail.iap.Protocol (Protokoll .java: 116) unter com.sun.mail.imap.protocol.IMAPProtocol. (IMAPProtocol.java:115) unter com.sun.mail.imap.IMAPStore.newIMAPProtocol (IMAPStore.java:685) at com. sun.mail.imap.IMAPStore.protocolConnect (IMAPStore.java:636) ... 4 weitere

Jede Hilfe wird sehr geschätzt.

+1

zeigen, dass Lösung und wir werden Ihnen helfen ... – epoch

+2

'StackOverflowError' ist am wahrscheinlichsten in unkontrollierten rekursiven Aufrufen auftreten, so analysieren den Code zu sehen wo kann das passieren –

+0

Was meinst du mit "Programmausführung stoppt"? Stürzt Ihre Anwendung ab? Wenn ja, welche Ausnahme sehen Sie? – Alex

Antwort

0

Pro Anfrage des OP. Überwachen von Wiederholungsversuchen mit Sarge-Framework

Ich habe Ihre Verbindungslogik in eine MailService-Klasse ausgelagert, damit ich sie überwachen kann.

public class MailService { 


public Store connect(String protocol, String host, String username, String password) throws MessagingException{ 

    Properties props = new Properties(); 
    props.setProperty("mail.store.protocol", "imap"); 
    //props.put("mail.pop3.host", host); 
    //props.put("mail.pop3.port", port); 
    //props.put("mail.pop3.starttls.enable", "true"); 

    Session session = Session.getInstance(props); 
    //session.setDebug(true); 
    Store store = session.getStore(protocol); 

    store.connect(host, username, password); 

    return store; 
} 

}

Dann änderte ich Ihre downloadEmails Implementierung der MailService zu verwenden und eine Plan für Sarge erstellen.

In diesem Beispiel wird fünfmal mehr als eine Minute wiederholt, wenn ConnectExceptions ausgelöst werden. Fügen Sie dem Plan nach Bedarf weitere Fehler-/Wiederholungsfälle hinzu.

bearbeiten

Meine pom

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>org.hall</groupId> 
    <artifactId>sarge</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>SargeExample</name> 
    <description>SargeExample</description> 
    <dependencies> 
    <dependency> 
     <groupId>javax.mail</groupId> 
     <artifactId>mail</artifactId> 
     <version>1.4.7</version> 
    </dependency> 
    <dependency> 
     <groupId>net.jodah</groupId> 
     <artifactId>sarge</artifactId> 
     <version>0.3.1</version> 
    </dependency> 
    </dependencies> 
</project> 
+0

Ich habe Änderungen am Code vorgenommen, aber ich kann den Code nicht ausführen .. Gibt es irgendeine Konfiguration, die für Sarge vorgenommen werden muss? Da ich neu bin, habe ich keine Ahnung was zu tun ist. Könntest du bitte helfen? –

+0

Ich habe meinen Maven Pom hinzugefügt. Maven wird die Abhängigkeiten herunterladen, die Sie kompilieren und ausführen müssen. Wenn Sie Maven oder Gradle nicht verwenden, ermutige ich Sie, sich die Zeit zu nehmen, ein grundlegendes Verständnis dafür zu entwickeln, wie man es benutzt. – MarkOfHall

Verwandte Themen