2017-11-09 4 views
0

3000 개가 넘는 메일이있는 메일 함을 읽어야합니다. 나는이 메일을 읽고 메일 내용을 가져 와서 다른 api에 본문을 공급해야합니다. 그것의 쉬운 몇 가지 메일 (나와 약 250),하지만 그 이후로 크게 느려졌습니다. 허용되는 대답은 link 뿐이며 다른 대안이 있습니다.JavaMail API - 메시지 내용에 대한 큰 Outlook 사서함 (> 3000) 읽기

참고 : 나는 직설적 인 접근 방법을 사용했기 때문에 의도적으로 스 니펫을 붙여 넣지 않았습니다. 예, FetchProfile도 사용했습니다.

답변

1

JavaMail IMAP 성능은 일반적으로 서버 속도, 필요한 네트워크 왕복 횟수 및 읽는 데이터의 양에 의해 제어됩니다. FetchProfile을 사용하는 것은 왕복 횟수를 줄이는데 필수적입니다. IMAP-specific FetchProfile items을 고려해야합니다.

JavaMail은 한 번에 메시지 내용을 버퍼에서 가져옵니다. 대형 메시지는 분명히 많은 버퍼 페치를 요구할 것이므로 많은 왕복이 필요합니다. mail.imap.fetchsize 특성을 설정하여 버퍼 크기 (기본값 16K)를 변경할 수 있습니다. 또는이 부분적 인출을 비활성화하고 mail.imap.partialfetch 속성을 false로 설정하여 한 번에 전체 내용을 가져 오도록 요구할 수 있습니다. 분명히 큰 메시지를 읽는다면 후자는 클라이언트에서 중요한 메모리를 요구할 것입니다.

JavaMail IMAP 공급자는 클라이언트에서 메시지 내용을 캐시하지 않지만 (일반적으로 아래 참조) 메시지 헤더를 캐시합니다. 매우 많은 수의 메시지를 처리 ​​할 때 IMAPMessage.invalidateHeaders 메서드를 호출하여 메시지 처리를 완료하면 헤더 캐시를 무효화하는 것이 도움이되는 경우가 있습니다. IMAPFolder.FetchProfileItem.MESSAGE을 사용할 때 메시지 내용은 캐시이며 위의 호출에 의해 무효화됩니다.

그 외에도 JavaMail debug output을 검사하여 예상되는 IMAP 명령 만 실행되고 프로그램에서 불필요한 IMAP 명령을 실행하게하는 작업을 수행하지 않도록해야합니다. 또한 프로토콜 명령에 대한 시간 소인을보고 서버 또는 클라이언트에서 시간을 소비하는지 여부를 판별 할 수 있습니다.

성능 저하 문제가 서버에서 발생하지 않는 것이 확실하다면 (수정하지 못함), 다음과 같이 사용자 지정 IMAP 명령을 조사해야합니다. 당신이 참조한 링크.

+0

다음 세 가지 코드를 변경했습니다. 1. mail.imap.partialfetch = false 2. IMAPFolder.FetchProfileItem.MESSAGE를 FetchProfile 객체에 추가했습니다. 3. 모든 메일을 구문 분석 한 후 invalidateHeaders() 메소드를 사용했습니다. 이로 인해 성능이 크게 향상되었지만이 부분적 가져 오기가 어떻게 작동 하는지를 알고 싶다면 한 버퍼에서 다음 버퍼로 제어 흐름을 잘 설명하지 못했습니다. – Shepherd

+0

더 많은 데이터 (예 : getInputStream에서 반환 한 스트림에서 읽음)를 요청하고 버퍼가 비어 있으면 더 많은 데이터를 요청합니다. –