2013-07-25 4 views
8

Unterhalb des Codes, der zum Herstellen und Ausführen von Vorgängen in einem IMAP-Ordner verwendet wird. Also meine Frage ist über die javax.mail.Session, die in diesem Fall jede Sekunde neu erstellt würde (abhängig von der Ruhezeit und Laufzeit von checkInbox()).Java-Mail: Sitzung

Ich bin mir sicher, dass dies keine gute Lösung ist, vor allem die Abfrage auf IMAP ist ein bisschen dumm, aber ich konnte nicht die IMAP listener läuft.

Das Erstellen der Sitzung nicht jeder Lauf könnte eine bessere Lösung sein, aber woher weiß ich, wann eine session is closed oder kann ich es absichtlich schließen? Aber es gibt nichts wie Session.close() oder ist die Sitzung als NULL? Oder gibt es eine definierte Timeout auf einer Sitzung ...

Quelle:

final String port = "993"; 

Properties prop = new Properties(); 

// I assume there is some redundancy here but this didn't cause any problems so far 
prop.setProperty("mail.imaps.starttls.enable", "true"); 
prop.setProperty("mail.imaps.port", port); 

/** This part can be removed 
* prop.setProperty("mail.imaps.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
* prop.setProperty("mail.imaps.socketFactory.port", port); 
* prop.setProperty("mail.imaps.socketFactory.fallback", "false"); 
*/ 
prop.setProperty("mail.imap.ssl.enable", "true"); 
prop.setProperty("mail.debug", "false"); 

// Create a session before you loop since the configuration doesn't change 
Session session = Session.getInstance(prop); 

// Nearly loop forever in Prod 
while(true){ 

    // Check the INBOX and do some other stuff 
    Store store = session.getStore("imaps"); 
    store.connect(host, user, pw); 

    // ... the operations on the session ... 

    store.close(); 

// Sleep a bit try & catch removed 
Thread.sleep(1000); 
} 

Alles in allem muss ich sagen, es ist wirklich schwer, gute Beispiele und Dokumentation für javax.mail zu finden (neben der API und der FAQ)

Antwort

10

Die Sitzung verwaltet nur Konfigurationsinformationen; Es ist nicht nötig, es zu schließen. Solange sich Ihre Konfiguration nicht ändert, können Sie die Sitzung einmal am Anfang erstellen und nur weiterverwenden.

Verbindungen sind auf der anderen Seite teuer und müssen sorgfältig von der Anwendung verwaltet werden. Eine Verbindung wird für den Speicher und für jeden geöffneten Ordner verwendet. Eine Verbindung kann jederzeit vom Server oder aufgrund eines Netzwerkfehlers geschlossen werden. Wenn eine Verbindung nicht aktiv genutzt wird, sollten Sie sie schließen.

Haben Sie die JavaMail-Spezifikation und die Beispielanwendungen auf der JavaMail project page gefunden? Sie werden bei vielen einfachen Problemen helfen, aber das Verbindungsmanagement ist ein fortgeschrittenes Problem.

Oh, und Sie können remove all that socket factory stuff und machen Sie Ihre Anwendung einfacher.

+0

Vielen Dank. Siehe die Änderungen in der Quelle oben. Hoffe, es ist jetzt viel besser und die Session und die Verbindung werden so behandelt, wie sie sollten. Wenn ich etwas Zeit habe, sollte ich einen IMAP-Listener bauen, um das Polling loszuwerden. Hast du eine Idee, wo ich anständige und aktuelle Beispiele oder Anleitungen dafür finden kann? – Kuchi

+0

Ich denke, in der /javamail-samples/monitorint.java habe ich gefunden, wonach ich suche. Es scheint, als ob ich nicht genug Aufmerksamkeit geschenkt habe, als ich das letzte Mal durchging. – Kuchi

+0

Ja, das sollte dich beginnen. –