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 существует только одно соединение, поэтому, если соединение разорвано, хранилище должно быть отключено, а папка должна быть закрыта.
- Если папка открыта, проверьте папку. В противном случае проверьте магазин.
- Вам нужна стратегия для обработки сбоев. Если вы отслеживаете, какие сообщения были успешно обработаны, вы можете возобновить обработку следующего сообщения после сбоя. Многие детали зависят от вашей среды и требований вашего приложения.
- Отключенный слушатель не сделает это проще.