Java Mail API, соединение теряется во время обработки сообщения - PullRequest
0 голосов
/ 07 мая 2018

В нашем приложении java mail (с использованием Java Mail API) мы сначала подключаемся к почтовому серверу, выбираем сообщения, обрабатываем заголовки, а затем обрабатываем тела и вложения сообщений, как обычно, с помощью pop3.

Session session = Session.getInstance(props, null);
Store store = session.getStore(urln);
store.connect();
Folder f = store.getFolder("INBOX");
f.open(READ);
Messages m = f.getMessages(..);
for (Message m : messages) {
    if (!store.isConnected()) {
        //raise exception
    }
    processSubject();

    processFrom();

    processBodyAndAttachments();

    ..
}

Реализация прекрасно работает в большинстве сред, но у некоторых клиентов соединение с магазином теряется во время процесса в цикле for.Мы можем видеть исключение повышения в журналах.Мои вопросы:

  • AFAIK, почтовый сервер может иногда отклонять новые подключения, но прерывает ли он текущие действующие подключения (может быть из-за слишком большого количества подключений или отключает старые для предоставления доступа кновые?)

  • Когда хранилище отключено, папка тоже закрывается?

  • Лучше проверить папку?

  • Соединение может быть потеряно повсюду в цикле for, и не рекомендуется помещать проверку isConnected во всем цикле, это делает код грязным, а также снижает производительностьПроблемы, это хорошая практика, чтобы вставить блок try catch и проверить IOExceptions?(Папка закрыта) Или другие предложения?Какие исключения должны быть обработаны?В некоторых случаях сообщение не может быть проанализировано, но соединение исправно.

  • Как насчет добавления прослушивателя отключения?

1 Ответ

0 голосов
/ 08 мая 2018
  • Сетевые подключения могут быть разорваны по разным причинам. Ваша программа всегда должна быть готова к разрыву соединения в любое время.
  • В POP3 только одно соединение, поэтому, если соединение разорвано, хранилище следует отключить, а папку закрыть.
  • Если папка открыта, проверьте папку. В противном случае проверьте магазин.
  • Вам нужна стратегия для обработки сбоев. Если вы отслеживаете, какие сообщения были успешно обработаны, вы можете возобновить обработку следующего сообщения после сбоя. Многие детали зависят от вашей среды и требований вашего приложения.
  • Отключенный слушатель не сделает это проще.
...