7
votes

Comment puis-je interrompre le ralenti de IMAP?

J'utilise l'API JavaMail Connexion à mon serveur IMAP. Tout fonctionne bien avec le javax.mail.folder.idle () méthode . Mon auditeur est appelé quand un nouveau courrier entre en jeu. Cependant, le problème est le ralenti des blocs pour toujours, comment puis-je l'interrompre? Comment puis-je effectivement arrêter l'écoute sans tuer mon programme Java?

J'ai essayé d'appeler Thread.Interrupt () sur le thread Idle'd. Rien ne se passe. Je manque d'idées.


0 commentaires

3 Réponses :


9
votes

Effectuer toute opération sur ce dossier (à partir d'un autre fil) provoquera la méthode inactif () pour revenir immédiatement. Donc, si vous souhaitez l'interrompre avec force, appelez simplement fermer () à partir d'un nouveau fil.


0 commentaires

4
votes

Si vous lisez correctement la documentation et lisez le code source, vous devez vous rendre compte que vous devez créer un nouveau thread pour appeler .Idle () . .

allouer ce fil à une variable, et quand vous voulez appeler le interruption () sur ce fil ou simplement ignorer les notifications!

Si vous avez besoin d'obtenir inactif () retourne à nouveau, il suffit de revenir sur le fil!

J'ai créé quelque chose de similaire, vous pouvez donc vouloir vérifier.

https: // github.com/mofirouz/javapushmail/blob/master/src/main/java/com/mofirouz/javapushmail/javapushmailAccount.java

bonne chance


1 commentaires

Je voterais pour cette réponse car il est simple, mais précis et informatif, j'avais une sorte de penser à la possibilité d'utiliser un fil externe pour le ralenti, mais une pensée que ce serait laid de conception, bien je suppose que cela doit être moche quand il s'agit de multithreading et de choses similaires. Donc, pour résumer, cette solution fonctionne très bien, j'étais trop paresseuse pour analyser de manière approfondie l'exemple dans le lien, mais j'ai testé selon ce poste et je peux confirmer que cela fonctionne bien, n'a pas remarqué des inconvénients jusqu'à présent.



0
votes

Un moyen approprié d'abandonner la commande inactive est l'extrait suivant. Notez que l'instance de dossier doit être identique à celle utilisée pour commencer au ralenti. J'ai testé les autres solutions proposées sur ce fil, mais ils n'ont pas fonctionné dans mon cas.

IMAPFolder folder = store.getFolder("INBOX");
try {
  folder.doOptionalCommand("Abort IDLE error mesage", new IMAPFolder.ProtocolCommand() {
  @Override
  public Object doCommand(IMAPProtocol p) throws ProtocolException {
    p.idleAbort();
    return Boolean.TRUE;
  }
});
} catch (MessagingException e) {
  e.printStackTrace();
}


2 commentaires

Avez-vous juste répondu à un enfant de 9 ans qui a une réponse acceptée?


Évidemment oui depuis que j'ai passé 1 jour à essayer de comprendre pourquoi la réponse proposée ne fonctionne pas.