2012-07-29 4 views
0

전자 메일을 보내는 절차가 있으며이 절차는 다른 기능 및 절차 (주로 경고 및 알림 보내기에 사용)에서 호출됩니다.절차 메일 알림 보내기

우리가 직면 한 한 가지 문제는 메일 서버가 다운 된 경우 함수 또는 프로 시저를 호출하면 실행이 중지된다는 것입니다. 즉, 그들이 수행해야하는 기능을 수행하지 않는다는 것입니다. 그 기능 또는 프로 시저를 호출하거나 그 문제에 대해 메일 서버가 다운 된 경우에도 MailProcedure가 호출해야하는 클라이언트가 해당 기능을 수행하는지 확인하려면 어떻게해야합니까?

어떻게하면됩니까? 도움이 많이 필요합니다. 메일 절차

CREATE OR REPLACE PROCEDURE MailProcedure(frm_id IN VARCHAR2, to_id IN VARCHAR2, subject IN VARCHAR2, body_text IN VARCHAR2) 
AS 
c utl_tcp.connection; 
rc integer; 
BEGIN 
c := utl_tcp.open_connection('email_server', 25); 
rc := utl_tcp.write_line(c, 'string'); 
rc := utl_tcp.write_line(c, 'from address'); 
rc := utl_tcp.write_line(c, 'to address'); 
rc := utl_tcp.write_line(c, 'Subject'); 
rc := utl_tcp.write_line(c, 'body'); 
utl_tcp.close_connection(c); 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     null; 
END; 
/
+0

메일 서버가 다운되면 어떻게됩니까? 발신자를 성공시키고 이메일을 보내지 않으시겠습니까? 나중에 배달하기 위해 이메일을 대기열에 넣으시겠습니까? 다른 것? 'MailProcedure'가 실제로'기타 예외 그 자체 '예외 핸들러를 가지고 있다면, 호출자는 어떻게 실패할까요? 작성된대로,'MailProcedure'는 자동적으로 실패 할 것입니다. 아마 최선의 해결책은 아니지만 호출자에게 예외를 발생시키지 않아야합니다. –

+0

메일 서버가 다운되면 메일을 보낼 수 없으며 나중에 배달 대기 상태가됩니다. 어떻게해야합니까? 감사합니다 – user75ponic

답변

3

나중에 배달을 위해 메일을 큐에 원하기 때문에

는 간단한 방법은 비동기 적으로 모든 이메일 메시지를 보내는 것입니다. 다른 절차는 다음 실제로 이메일을 감지하고 큐에서 메시지를 제거하는 별도의 스레드에서 실행되는 별도의 절차를했을 ​​새로운 mail_queue 테이블

CREATE OR REPLACE PROCEDURE QueueMail(p_from IN VARCHAR2, 
             p_to IN VARCHAR2, 
             p_subject IN VARCHAR2, 
             p_body IN VARCHAR2) 
AS 
BEGIN 
    INSERT INTO mail_queue(mail_queue_id. from, to, subject, body) 
    VALUES(mail_queue_seq.nextval, p_from, p_to, p_subject, p_body); 
END; 

에 행을 삽입하는 QueueMail 프로 시저를 호출하는 것입니다. 예 :

CREATE OR REPLACE PROCEDURE SendQueuedMessages 
AS 
BEGIN 
    FOR msg IN (SELECT * FROM mail_queue) 
    LOOP 
    sendMessage(msg.from, msg.to, msg.subject, msg.body); 
    DELETE FROM mail_queue 
    WHERE mail_queue_id = msg.mail_queue_id; 
    commit; 
    END LOOP; 
END; 

여기에서 sendMessage은 전자 메일을 보내기위한 실제 논리를 구현합니다. utl_tcp을 사용하는 대신 utl_mail 또는 utl_smtp 패키지를 사용하여 전자 메일을 보내려하지만 utl_tcp을 사용할 수 있습니다. 그런 다음 dbms_job 또는 dbms_scheduler 패키지를 사용하여 SendQueuedMessages 절차를 예약하십시오. 이

DECLARE 
    l_jobno PLS_INTEGER; 
BEGIN 
    dbms_job.submit(l_jobno, 
        'BEGIN SendQueuedMessages; END;', 
        sysdate + interval '1' minute, 
        'sysdate + interval ''1'' minute'); 
    commit; 
END; 

같은 뭔가가 SendQueuedMessages 절차를 매 분마다 실행되는 작업을 만들 것입니다. 메일 서버가 다운되면 SendQueuedMessage 절차가 실패하고 작업이 자동으로 다시 실행되도록 일정이 조정됩니다. 처음 실패한 후 1 분 후에 작업이 다시 실행됩니다. 두 번째 실패 후 16 분 연속 실패 할 때까지 2 분 후, 4 분, 8 분 등으로 실행됩니다. SendQueuedMessages 프로 시저에서 예외를 catch하려면 기본 동작 이외의 다른 것을 선택할 수 있습니다. 작업 실패로 인해 경고 로그에 오류가 기록되므로 DBA는 예외를 처리하고 불필요한 데이터가 경고 로그에 기록되지 않도록 작업 일정을 조정하도록 요청할 수 있습니다.

+0

멋진 답변을 주셔서 감사합니다 저스틴. 지정된 시간에 작업을 수행 할 작업을 수행 할 것입니다. 매우 감사. – user75ponic