JavaMail - почему время от времени я получаю исключение StoreClosedException при работе с папкой? - PullRequest
4 голосов
/ 04 марта 2011

У меня есть следующий фрагмент кода:

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

Иногда я получаю следующее исключение:

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 [***]

Я не уверен, является ли это результатом того, что я неправильно использовал API JavaMail, или это проблема сервера. У меня есть два замечания:

  1. Ошибка возникает при проверке существования папки, а не при вызове getFolder.

  2. getFolder вызывается более одного раза в коде.

Полагаю, возможно, что соединение с почтовым сервером время от времени прерывается после того, как folder.getMessages () время от времени, но оно ВСЕГДА терпит неудачу при вызове exist (), а не вызове create ().

Одно из решений заключается в том, чтобы сначала вызвать store.isConnected () и переподключить, если это необходимо, но я хочу выяснить, есть ли что-то, что я делаю неправильно, прежде чем прибегнуть к этому.

Буду признателен за любые идеи или советы о том, как глубже исследовать источник этого исключения. Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 07 ноября 2013

Проблема в том, что вы не закрываете папку.После использования мы должны закрыть папку.Снова откройте папку, когда это необходимо.Не открывайте одну и ту же папку много раз.

folder.close(false);
.
.
.
.
.
.
if (!folder.isOpen()) {
    folder.open(Folder.READ_ONLY);
}
1 голос
/ 04 июня 2016

Я проследил это до самого сервера.Я подключался к Dovecot с помощью рекурсивного метода для копирования всей структуры папок.

(По сути, я отказываюсь от ImapCopy из его необслуживаемой версии 2008 года, полагаясь на старые Log4J и JGoodies, чтобы использовать собственные формы Swing / Netbeans и более новый Log4j, а также для поддержки серверов, которые не допускают смешивание папок и сообщений)

Это был сам dovecot: 2016-06-04T01: 48: 34.538050-04: 00 moz dovecot: imap-login: Превышено максимальное количество соединений от пользователя + IP (mail_max_userip_connections = 10): user =, method =PLAIN, rip = 10.1.4.21, lip = 10.1.4.235, TLS, session = <6MXUY200UQAKrgQV>

Так что теперь мне нужно обновить это поле, чтобы разрешить более 10 подключений.Или, точнее, потому что я планирую использовать его на o365, каким-то образом сначала прочитать структуры папок (без открытия новых соединений или закрытия старых), а затем циклически перебирать структуру папок отдельно для обработки сообщений.

...