Java Почта IMAP занимает много времени для получения сообщений в почтовом ящике, 25 секунд для получения 20 сообщений - PullRequest
0 голосов
/ 24 января 2020

Есть ли способ повысить производительность при получении сообщений с сервера Javamail IMAP? Я нашел несколько советов, но не смог улучшить производительность. Этот метод будет получать около 20 сообщений из папки, и, возвращая отформатированные сообщения в DTO, я попытался закомментировать строки, чтобы получить вложения и получить получателей, но он ничего не меняет в производительности.

/**
 * Get all the emails that are inside the param folder
 *
 * @param folderId   folder to return the emails from the informed folder.
 * @param pageToken  pageToken to be used as pagination
 * @param maxResults maxResults to create a limit to the number of registers
 * @return {@link EmailsDTO} with all the messages
 */
public EmailsDTO getMessages(final String folderId, final String pageToken, final Integer maxResults) {
    final Properties properties = getServerInputProperties();
    final Session session = Session.getDefaultInstance(properties);
    try {
        final EmailsDTO emailsDTO = new EmailsDTO();
        final List<EmailDTO> emailDTOList = new ArrayList<>();

        // connects to the message store
        final Store store = session.getStore(IMAP);
        store.connect(email, password);

        // opens the folder to search the messages
        final Folder folder = store.getFolder(folderId);
        folder.open(Folder.READ_ONLY);

        //set a pagination used to get the results in JavaMail
        final int pageStart = nonNull(pageToken) ? Integer.valueOf(pageToken) : 1;
        final int pageEnd = (pageStart + maxResults) > folder.getMessageCount() ? folder.getMessageCount() : pageStart + maxResults;


        // fetches new messages from server, starts with 1
        final Message[] messages = folder.getMessages(pageStart, pageEnd);

        final FetchProfile fetchProfile  = new FetchProfile();
        fetchProfile.add(FetchProfile.Item.ENVELOPE);
        folder.fetch(messages, fetchProfile); // Load the profile of the messages in 1 fetch.

        for (final Message msg : messages) {
            final EmailDTO emailDTO = new EmailDTO();
            emailDTO.setId(msg.getHeader(MESSAGE_ID)[0]);
            emailDTO.setCc(this.parseAddresses(msg.getRecipients(Message.RecipientType.CC)));
            emailDTO.setTo(this.parseAddresses(msg.getRecipients(Message.RecipientType.TO)));
            emailDTO.setBcc(this.parseAddresses(msg.getRecipients(Message.RecipientType.BCC)));

            emailDTO.setFrom(this.getFrom(msg.getFrom()));
            emailDTO.setRead(msg.getFlags().contains(Flags.Flag.SEEN));
            emailDTO.setHasAttachments(this.hasAttachments(msg));
            emailDTO.setSubject(msg.getSubject());
            emailDTO.setMessage(this.getMessageContent(msg));

            emailDTO.setAttachments(this.getAttachements(msg));
            emailDTO.setDate(msg.getReceivedDate().toString());
            emailDTO.setParentFolder(msg.getFolder().getName());
            //TODO: see what need to put here emailDTO.setLabels();
            emailDTOList.add(emailDTO);
        }

        // disconnect
        folder.close(false);
        store.close();

        emailsDTO.setEstimatedNumberOfMessages(folder.getMessageCount());
        emailsDTO.setNextPageToken(String.valueOf(emailDTOList.size()));
        emailsDTO.setMessages(emailDTOList);
        return emailsDTO;
    } catch (final MessagingException | IOException e) {
        throw new RuntimeException(String.format("couldn't get messages from the folder with id: %s", folderId), e);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...