2010-12-02 2 views
13

내 신청서가 임시로 이메일을 보내야합니다. javamail의 getDefaultSession과 getTransport를 사용하여 메시지를 보내고 예상대로 작동합니다.javamail 세션 전송을 열어 두어도 괜찮습니까?

그러나 전송 시간이 오래 걸리는 것으로 나타났습니다. 전송 당 최대 7 초가 소요될 수 있습니다. 나는이 같은 단계를 무너 뜨리는 경우

Transport transport = session.getTransport("smtp"); 
transport.connect(); 
transport.sendMessage(msg, addresses) 
transport.close(); 

을 ... 나는, 때마다 시간의 거의 모든 걸리는 연결() 호출이 있다고 볼 수 있습니다.

내가 발견 한 모든 예제는 전송, 연결, 전송, 연결 해제를 수행합니다. 물론 그들은 모두 단발적 인 예이거나 한 번의 호출로 대량의 이메일을 전송합니다.

나는이처럼, 난 그냥 열려있는 연결을 떠날 수 생각 :

Transport transport = session.getTransport("smtp"); 
if (!transport.isConnected()) 
    transport.connect(); 
transport.sendMessage(msg, addresses) 

을 (여기에, 그의 변형있다 : java mail keeping Transport object connected).

나는 어떤 종류의 종료 후크에서 결국 그것을 닫아야 할 것이다. 그리고 나는 폴백을 가져야 만 할 수도있다. (연결이 끊어져도 전송이 깨닫지 못한다면). 그러나 응용 프로그램 수명 동안 이것을 열어 두지 않는 이유가 있습니까?

덕분에, 알라

답변

7

은 정말 개방 단일 SMTP 연결을 유지에 문제가 표시되지 않고, 전송 오브젝트의 사용이 연결 재사용합니다 (JavaMail tutorial 참조)을 권장합니다.

또한, 하나의 smnt 연결 (전송을 통해)을 응용 프로그램에서 열어 단일 관리자 인스턴스 (예 : 단일 패턴 사용)로 유지하고 다른 연결을 유지하는 최종 비용을 피할 것을 권장합니다. 메시지를 보내야하는 모든 구성 요소에 대해 @Bill Shannon 년대 (JavaMail에의 저자) 여기에 대한 답변으로 당

+0

안녕하세요 토마스, 저에게 감사드립니다. 정확히 내가 바라는 바였습니다. 나는 실제로 싱글 톤 'EmailSender'인스턴스 내에서 사용하려고 계획하고 있으므로 이것이 좋을 것입니다. – Alastair

+0

이 접근 방식은 내 대답 – Yura

2

: Threadsafety in Javamail

을와 전송하기 때문에 메일 서버에 대한 연결을 나타내며, 단 하나의 스레드가 한 번에 연결을 사용할 수 있습니다하는 전송은 스레드 안전성을 유지하기 위해 여러 스레드의 액세스를 동기화하지만 실제로는 단일 스레드에서만 사용하려고합니다. 당신이 (요즘은 보통의 경우) 여러 스레드에서 단일 Transport 인스턴스를 사용하려는 경우

그래서, 실제로보기의 성능 관점에서 매우 나쁜 생각입니다. 을 사용하여 Transport 인스턴스의 풀을 개발하는 것이 더 나을 것입니다.

+0

에 설명 된대로 멀티 스레드 환경에서 심각한 성능 문제를 야기 할 수 있습니다. 누군가가 이러한 풀에 대한 코드 예를 필요로합니까? 여기에 의견을 남기십시오. – Yura

관련 문제