2013-07-25 10 views
8

Sotto il codice utilizzato per connettersi ed eseguire operazioni su una cartella IMAP. Quindi la mia domanda riguarda lo javax.mail.Session che in questo caso ricreverebbe ogni secondo (a seconda del tempo di sonno e del runtime di checkInbox()).Java Mail: Session

Sono sicuro che questa non è una buona soluzione, specialmente il polling su IMAP è un po 'stupido, ma non sono riuscito a far funzionare il IMAP listener.

Ricreare la sessione non tutte le corse potrebbero essere una soluzione migliore ma come faccio a sapere quando un session is closed o posso chiuderlo di proposito? Ma non c'è niente come Session.close() o la Sessione è NULL? O c'è qualche timeout definito su una sessione ...

Fonte:

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

Tutto sommato devo dire che è davvero difficile trovare buoni esempi e la documentazione per javax.mail (oltre allo API e allo FAQ)

risposta

10

La Sessione gestisce solo le informazioni di configurazione; non c'è bisogno di chiuderlo. Finché la configurazione non cambia, puoi creare la Sessione una volta all'inizio e continuare a usarla.

I collegamenti, d'altra parte, sono costosi e devono essere gestiti con attenzione dall'applicazione. Una connessione è utilizzata per lo Store e per ogni cartella aperta. Una connessione può essere chiusa in qualsiasi momento, dal server o a causa di un errore di rete. Se una connessione non viene utilizzata attivamente, è necessario chiuderla.

Hai trovato le specifiche JavaMail e le applicazioni di esempio su JavaMail project page? Aiuteranno con un sacco di problemi semplici, ma la gestione delle connessioni è un problema più avanzato.

Oh, e puoi remove all that socket factory stuff e rendere l'applicazione più semplice.

+0

Grazie mille. Vedi le modifiche nella fonte sopra. Spero che ora vada meglio e che la Sessione e la connessione siano gestite nel modo giusto. Quando ho un po 'di tempo, dovrei creare un listener IMAP per sbarazzarmi del polling. Hai idea di dove posso trovare esempi o guide decenti e aggiornati per questo? – Kuchi

+0

Credo che nel /javamail-samples/monitorint.java ho trovato quello che sto cercando. Sembra che non abbia prestato abbastanza attenzione quando l'ho passato l'ultima volta. – Kuchi

+0

Sì, questo dovrebbe iniziare. –