Estoy haciendo un programa que necesita monitorear una cuenta de Gmail para nuevos mensajes, y para poder obtenerlos ASAP estoy usando la función inactiva de JavaMail. Aquí es un fragmento de código de la rosca que estoy utilizando para llamar folder.idle():JavaMail: Mantener IMAPFolder.idle() con vida
//Run method that waits for idle input. If an exception occurs, end the thread's life.
public void run() {
IMAPFolder folder = null;
try {
folder = getFolder();
while(true)
{
//If connection has been lost, attempt to restore it
if (!folder.isOpen())
folder = getFolder();
//Wait until something happens in inbox
folder.idle(true);
//Notify controller of event
cont.inboxEventOccured();
}
}
catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("MailIdleWaiter thread ending.");
}
El método getFolder() básicamente se abre la conexión con el servidor IMAP y abre la bandeja de entrada.
Esto funciona por un tiempo, pero después de 10 minutos o así deja de recibir actualizaciones (no se lanza ninguna excepción).
Estoy buscando sugerencias para mantener viva la conexión. ¿Necesito un segundo hilo cuyo único rol es dormir y renovar el hilo inactivo() cada 10 minutos o hay una forma más fácil/mejor?
Gracias de antemano.
Estoy planeando hacer lo mismo. ¿Finalmente pudiste resolver el problema? Actualmente, estoy sondeando la carpeta a través de 'folder.open/folder.close' cada 15 segundos, pero IDLE sería mejor, por supuesto. Estoy planeando usar esto en un entorno de servidor de aplicaciones. – Theo
Disculpa por no haber visto tu comentario antes. Terminé abandonando el proyecto, por lo que nunca me acerqué a una solución. Pero ahora que este hilo tiene una respuesta, tal vez eso funcione ... aunque se basa en encuestas y no está inactivo. – Anders
Tienes que sondear y estar inactivo para hacerlo correctamente. IDLE tiene que terminarse y renovarse cada media hora de acuerdo con la especificación y más a menudo si una NATbox rota está en camino. El intervalo correcto es ... bueno, quizás no haya un valor correcto. – arnt