Java Mail api, соединение теряется во время обработки сообщения

В нашем приложении 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 везде в цикле, это сделает код грязным и также вызовет проблемы с производительностью, если это хорошая практика попробуйте перехватить блок и проверить IOExceptions? (Папка закрыта) Или другие предложения? Какие исключения должны быть обработаны? В некоторых случаях сообщение не может быть проанализировано, но соединение исправно.

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

1 ответ

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