2009-11-09 2 views

답변

9

요청 대기열. 큐에 들어가기를 기다리는 별도의 스레드를 가지고 전자 메일을 보내려고 시도하십시오. 실패하면 몇 시간 후에 다시 시도합니다. 메시지를 보내면 대기열로 돌아가서 다음 메시지를 가져옵니다.

+0

동의합니다. 좀 더 정교해질 기회가 있다면, 메시지가 반복되는시기를 알기에 충분한 큐 클래스를 만들 수 있습니다. 그런 다음 메일 서버가 다시 작동하면 네트워크가 다운되었음을 알리는 5,000 건의 전자 메일을받지 못합니다. :) –

+0

보장 된 배송을 원할 경우 응용 프로그램이 다운되고 대기열이 명확하지 않을 경우를 대비하여 데이터 저장소 (데이터베이스, 파일 등)를 사용하여 배달해야합니다. –

+0

또는 전달을 보장하는 JMS 큐 관리자를 사용하십시오. 상업적으로 이용 가능한 이들이 많이 있습니다. –

2

보내기에 실패 할 때 전자 메일 개체를 스택 또는 목록에 넣습니다. 전자 메일 서버가 다시 시작되면 각 전자 메일이 비어있을 때까지 팝합니다.

2

전자 메일을 파일 (예 : xml 파일)에 저장하여 응용 프로그램이 손상되면이 정보가 손실되지 않도록 할 수 있습니다.

이 파일은 응용 프로그램이 시작될 때로드되며 모든 내용이 메모리에 유지되므로 보류중인 전자 메일이있는 동안 5 분마다 검사가 계속되고 전자 메일을 보낼 때 xml 파일을 다시 저장합니다 그래서 10시에 3 개의 이메일을 보낸 후에 충돌이 발생하면 시동시 3 개의 이메일을 다시 보내지 않습니다.

그러나 어떻게 처리할지는 오류 조건을 처리하는 방법에 대한 사양에 따라 달라집니다.

+1

충돌을 처리하려면 쓰기 중 크래시가 많은 부분의 데이터를 잃을 수 있으므로 같은 파일에 쓰지 않아야합니다. 여러 파일을 사용하는 것이 더 안전합니다. –

+0

사실, 편집증 수준에 따라 파일 두 개를 사용할 수 있으며 문제의 가능성을 줄이기 위해 원본 파일을 교체 한 다음 쓰기 만하면됩니다. 그것은 모두 당신이 신뢰성에 얼마나 의존하는지에 달려 있습니다. –

+0

보류중인 메시지의 디렉터리를 유지 관리하지 않는 이유는 무엇입니까? 당신이 부패의 가능성을 제한하고 잠재적으로 거대한 하나의 파일을 읽거나 쓰지 않는 것입니다. –

2

"항상 모든 SMTP 서버로 전달"에서 나중에 다시 시도하는 것처럼 전체 SMTP 서버에서 일반적으로 처리하는 모든 종류의 조건을 처리해야하는 상황에 이르면 연결이 닫히면 다시 전송하십시오. MX 호스트를 명시된 순서대로 비슷하게 사용한다면 인 SMTP 서버를 클라이언트 (그러나 들어오는 연결을 허용하지 않는 SMTP 서버)로 간주하는 것이 좋습니다. 이렇게하면 모든 더러운 논리가 응용 프로그램에서 멀리 이동하기 때문입니다.

제임스 전자 메일 서버 - http://james.apache.org/은 쉽게 임베드 할 수 있지만 실제로 시도하지는 않았다고 생각합니다.

+0

왜 메일 서버를 응용 프로그램에 넣으시겠습니까? 로컬 호스트에 하나만 설치하십시오. – Chomeh

+0

@JimV 당신은 그렇게 할 권한이 없을 수도 있습니다. –

0

제임스를 사용하는 것이 좋습니다. 그러나 제임스가 약간 벗겨져서 다시 시작해야하는 몇 가지 문제가있었습니다.

Quartz와 같은 것을 사용하여 스케줄러가 전송해야하는 메시지를 확인하도록 할 수 있습니다. 메시지를 보낼 수없는 경우 (예 : SMTP 서버를 사용할 수없는 경우) 해당 메시지는 나중에 보내도록 일정이 변경됩니다. 메시지 당 작업이 있거나 메시지를 확인하고 사용 가능한 메일 서버가 메시지를 보내는 영구 작업을 가질 수 있습니다. 지속적인 작업을 통해 전자 메일을 일괄 처리 할 수 ​​있습니다.

0

유닉스/리눅스 환경에 있다면 syslog을 사용하여 경고를 전송하고 그 측면에서 전자 메일을 처리하는 방법을 고려하십시오. 예를 들어 nsyslogd에는 기본적으로 전자 메일을 생성하기위한 ommail이라는 모듈이 있습니다.

IIRC에는 최소한 log4j 코딩을 사용하여 Java 및 syslog 세계 사이를 연결할 수있는 log4j 및 기타 어댑터가 있습니다.

0

아파치 제임스 - http://james.apache.org/는 자신 만의 메일 서버를 프록시로 실행할 수있게 해줄뿐만 아니라 100 % 자바로 작성되므로 을 수행하고 무엇을하고 있는지 파악할 수 있으며 추가로 James가 데이터베이스를 대기열로 사용합니다 우편으로, 그래서 당신은 심지어 데이터베이스에 삽입하여 대기열에 직접 메일을 삽입 할 수 있습니다, 그리고 제임스에게 메일을 보내는 전체 업무를 남겨주세요.

관련 문제