4 Stimmen

JavaMail - warum erhalte ich sporadisch eine StoreClosedException bei einer Ordneroperation?

Ich habe das folgende Codefragment:

// using classes from javax.mail.*
// Session / Store setup code
// Store implementation class = com.sun.mail.imap.IMAPStore

Folder folder = store.getFolder("INBOX");  // store setup previously
folder.open(Folder.READ_WRITE);
Message[] messages = folder.getMessages();
Folder anotherFolder = store.getFolder("F1");
if ( !anotherFolder.exists()) {                   [***]
  anotherFolder.create(Folder.HOLDS_MESSAGES);
}
folder.copyMessages(messages, anotherFolder);

Gelegentlich erhalte ich die folgende Ausnahme:

javax.mail.StoreClosedException: failed to create new store connection
   at com.sun.mail.imap.IMAPFolder.throwClosedException(IMAPFolder.java:2208)
   at com.sun.mail.imap.IMAPFolder.doCommand(IMAPFolder.java:2335)
   at com.sun.mail.imap.IMAPFolder.exists(IMAPFolder.java:427)
   at [***]

Ich bin mir nicht sicher, ob dies darauf zurückzuführen ist, dass ich die JavaMail-API falsch verwende, oder ob es sich um ein Serverproblem handelt. Ich habe zwei Beobachtungen:

  1. Der Fehler tritt auf, wenn das Vorhandensein des Ordners geprüft wird, und nicht, wenn getFolder aufgerufen wird.

  2. getFolder wird mehr als einmal im Code aufgerufen.

Ich nehme an, dass es möglich ist, dass die Verbindung zum Mailserver irgendwann nach dem Aufruf von folder.getMessages() abbricht, aber es schlägt IMMER beim exist()-Aufruf fehl, im Gegensatz zum create()-Aufruf.

Eine Lösung besteht darin, store.isConnected() zuerst aufzurufen und die Verbindung bei Bedarf wiederherzustellen, aber ich möchte erst herausfinden, ob ich etwas falsch mache, bevor ich darauf zurückgreife.

Ich wäre dankbar für jede Einsicht oder jeden Ratschlag, wie ich die Ursache dieser Ausnahme näher ergründen kann. Vielen Dank im Voraus!

4voto

SANN3 Punkte 8551

Das Problem ist, dass Sie den Ordner nicht schließen. Nach der Verwendung müssen wir den Ordner schließen. Öffnen Sie den Ordner bei Bedarf wieder. Öffnen Sie nicht mehrmals denselben Ordner.

folder.close(false);
.
.
.
.
.
.
if (!folder.isOpen()) {
    folder.open(Folder.READ_ONLY);
}

1voto

EMR Punkte 21

Ich habe das Problem auf den Server selbst zurückgeführt. Ich habe eine Verbindung zu Dovecot mit einer rekursiven Methode hergestellt, um die gesamte Ordnerstruktur zu kopieren.

(Im Grunde bin ich forking ImapCopy aus seiner 2008 ungewartete Version unter Berufung auf alte Log4J und JGoodies zu verwenden, native Swing/Netbeans Formulare und neuere Log4j, und auch zur Unterstützung von Servern, die nicht erlauben, Ordner & Nachrichten vermischt)

Es war dovecot selbst: 2016-06-04T01:48:34.538050-04:00 moz dovecot: imap-login: Maximale Anzahl von Verbindungen von Benutzer+IP überschritten (mail_max_userip_connections=10): user=, method=PLAIN, rip=10.1.4.21, lip=10.1.4.235, TLS, session=<6MXUY200UQAKrgQV>

Jetzt muss ich dieses Feld aktualisieren, um mehr als 10 Verbindungen zuzulassen. Oder, besser gesagt, weil ich plane, es auf o365 zu verwenden, irgendwie die Ordnerstrukturen zuerst rekursiv zu lesen (ohne neue Verbindungen zu öffnen oder alte zu schließen) und dann die Ordnerstruktur separat zu durchlaufen, um die Nachrichten zu verarbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X