JavaMail: Garder IMAPFolder.idle() vivant
Je fais un programme qui a besoin de surveiller un compte Gmail pour les nouveaux messages, et afin de les rendre le plus vite possible, je suis en utilisant JavaMail de veille de fonctionnalité. Voici un extrait de code dans le thread, je suis à l'aide de l'appel de dossier.idle():
//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.");
}
La méthode getFolder() ouvre essentiellement la connexion au serveur IMAP et ouvre la boîte de réception.
Cela marche un temps, mais au bout de 10 minutes il s'arrête obtenir des mises à jour (aucune exception n'est levée).
Je suis à la recherche de suggestions de garder la connexion. Ai-je besoin d'un deuxième thread dont le seul rôle est de dormir et de renouveler le régime de ralenti() thread toutes les 10 minutes ou est-il un moyen plus facile/mieux?
Merci d'avance.
Désolé pour ne pas s'apercevoir de votre commentaire plus tôt. J'ai fini par abandonner le projet, donc je n'ai jamais eu plus proche d'une solution. Mais maintenant que ce fil a une réponse, peut-être que ce sera le travail... même si c'est basé sur l'interrogation et ne pas inactif.
Vous avez à la fois le sondage et être inactif pour le faire correctement. RALENTI doit être arrêté et renouvelé chaque demi-heure, selon la spécification et plus souvent si une fracture de la NATbox est dans la manière. Le droit de l'intervalle est... eh bien, peut-être qu'il n'est pas une Valeur Correcte.
Toute les bonnes solutions? J'ai un problème similaire, avec moi-même. Je veux attendre les bras croisés jusqu'à ce qu'un nouveau message est inséré dans le dossier boîte de réception, tout en gardant la connexion. Je ne veux pas utiliser d'interrogation.
OriginalL'auteur Anders | 2010-11-11
Vous devez vous connecter pour publier un commentaire.
Une erreur commune est de supposer une commande INACTIF vais continuer à poster des mises à jour indéfiniment. Cependant, la RFC 2177, qui définit le régime de RALENTI extension états:
GMail en particulier, a beaucoup moins de délai d'attente, comme vous le dites, environ 10 minutes.
Nous avons simplement besoin d'exécuter de nouveau la commande INACTIF toutes les 9 minutes pour que cela fonctionne. Le
javax.mail
Api ont aucun moyen de définir un délai d'attente pour la commande INACTIF, de sorte que vous aurez besoin d'un deuxième thread pour se déplacer.Une première approche serait d'avoir le deuxième thread interrompre la première, la manipulation de l'exception et de l'ignorer. Cependant, cela permettrait pas de moyen propre à l'arrêt du thread, donc je ne le recommande. Beaucoup le moyen le plus propre est d'avoir le deuxième thread émettre une commande NOOP pour le serveur. Ce n'est rien du tout, mais il est suffisant d'avoir RALENTI abandonner et d'être réédité.
Je ici pour donner un peu de code pour ce faire:
OriginalL'auteur Johnco
Fait le Java Mail échantillons comprennent un IMAP IDLE exemple, qui est comme suit.
En outre, les IdleManager classe pourrait être intéressant.
OriginalL'auteur stefan.at.wpf
La suggestion de @user888307 est un sale hack et finit par échouer lamentablement. Il n'y a vraiment qu'une seule façon correcte de le faire.
Appeler la veille(faux) méthode sur le dossier actuellement sélectionné. Idéalement Boîte de réception parce que recevront tous les messages.
Appel en attente(false) sera essentiellement suspendez l'exécution du thread, afin de mieux mettre en veille(false) sur un nouveau thread. Ensuite, une fois que vous recevez un nouvel e-mail/notification à l'aide de messageCountChange, vous avez de relancer ce fil.
C'est la seule vraie manière d'y parvenir. J'ai écrit un wrapper pour votre explicite problème que je suis en train d'écrire un programme appelé JavaPushMail. Vous trouverez plus d'infos sur mon site (http://www.mofirouz.com/wordpress) ou vous pouvez récupérer l'application (qui est actuellement en cours de développement) sur GitHub https://github.com/mofirouz/JavaPushMail
La javadoc @Mo vous n'avez pas vraiment répondre à la question. Vous donnez un lien vers un dépôt github et un blog wordpress. Appel en attente() et inactives(false) permettra à la fois d'accrocher le moteur d'exécution et doivent être exécutés sur leur propre thread. Vous dites aussi que "la proposition" mais comme il s'agit d'un vote sur des S. O. il n'y a aucune garantie que la réponse ci-dessus resteront ci-dessus.
J'utilise @Mo de travail, c'est incroyable. Bon travail 🙂
OriginalL'auteur Mo Firouz
de vérifier le nombre de messages toutes les 5 minutes fonctionne pour moi:
Aussi, veuillez ne JAMAIS utiliser un vide bloc catch. Même si vous êtes SÛR qu'il ne se passerait (pas ce cas), il est préférable de l'enregistrer.
OriginalL'auteur user888307