수백만 개의 메시지가 담긴 대형 메일 함이 있습니다. 첨부 파일이 있는지 여부에 관계없이 각 메일에 대해 배우고 싶습니다. 관심있는 크기, 이름, 첨부 파일 수, 참 거짓만으로 충분합니다. 이 코드를 사용하고 프로파일 러 도구로 모니터 할 때 message.getContent()가 메모리를 소비하고 지우지 않습니다. 수백만 개의 메시지를 처리하기 때문에 메모리 부족 문제가 발생합니다. 그 이유는 getContent() 메 메모가 일부 데이터를 캐시하고 유지하기 때문입니다.Java, IMAP, 메시지를 가져 오지 않고 첨부 파일이 있는지 확인하십시오.
getContent을 호출하지 않고이 코드의 대안은 무엇입니까? 또는 getContent에 의해 설정된 캐시를 강제로 지우려면 어떻게해야합니까? 어떻게하면이 케이스에 message.writeTo()을 적용 할 수 있습니까?
//processing million message instances in a loop i=1, 1000000
Multipart multiPart = (Multipart) message[i].getContent();
for (int i = 0; i < multiPart.getCount(); i++) {
MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(i);
if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
// yes, it has an attachment
return true;
}
}
return false;
메시지를 보거나 보지 않음으로써 메시지를 줄일 수 있습니다. 예 : http://stackoverflow.com/questions/12988799/javamail-check-message-content-gmail-imap –
일부 비즈니스 규칙으로 인해이 모든 것이 필요합니다. 헤더 (제목 등) 만 가져오고 메모리 나 성능 문제없이 본문, 첨부 파일을 무시합니다. 하지만 첨부 파일이 있거나없는 경우에만 필요합니다. 본문 및 첨부 파일을 가져 오면 나중에 사용자가 메시지를 선택할 때 수행됩니다. – benchpresser