2008-09-30 5 views

답변

4

예, 응용 프로그램이 중지되었을 때 정상적으로 종료되도록하려면 프로세스를 감독 계층에 추가해야합니다. (그렇지 않으면 연결이 끊어지기 때문에 의존하는 응용 프로그램 인프라로 인해 실패하게됩니다.)

{Id, {yourapp_client_connection, start_link_with_socket, []}, Restart, Shutdown, worker, temporary}의 하위 사양을 가진 yourapp_client_sup이라고 말하는 simple_one_for_one 전략 수퍼바이저를 만들 수 있습니다. temporary 유형은 중요합니다. 연결 처리기에 대한 유용한 재시작 전략이 없기 때문입니다. 연결을 다시 시작하기 위해 클라이언트에 연결할 수 없습니다. 여기서 temporary은 관리자가 연결 처리기 종료를보고하지만 그렇지 않으면 무시합니다.

gen_tcp:accept을 수행하는 프로세스는 yourapp_client_sup:start_link(Socket, Options, ...) 대신 supervisor:start_child(yourapp_client_sup, [Socket,Options,...])을 수행하여 연결 처리기 프로세스를 만듭니다. youreapp_client_connection:start_link_with_socket 함수가 gen_server 또는 proc_lib 함수 (supervisor 모듈의 요구 사항)를 통해 자식을 시작하고 함수가 gen_tcp:controlling_process 인 자식에 대한 소켓 제어를 전송하는지 확인하십시오. 그렇지 않으면 자식이 소켓을 사용할 수 없습니다.

다른 방법은 yourclient_connection_handler 프로세스가 시작할 때 연결할 수있는 더미 yourapp_client_sup 프로세스를 만드는 것입니다. yourapp_client_sup 프로세스는 부모로부터 연결 처리기 프로세스로 EXIT 메시지를 전파하기 위해 존재합니다. 트랩이 존재해야하며 부모의 메시지가 아닌 다른 메시지가 모두 EXIT이면 무시해야합니다. 전체적으로 관리자 접근 방식 인 simple_one_for_one을 선호합니다.

2

이러한 프로세스가 많은 것으로 예상 경우에는 책임을 분리 (어쩌면 것들을 간단하게하기 위해 simple_one_for_one 설정을 사용으로 메인 관리자에서 감독자를 추가하는 좋은 아이디어가 될 수 , 어쩌면 당신의 현재의 경우보다 간단합니다).

이러한 프로세스를 제어해야하는 경우 감독자가 있어야합니다. 성공 여부에 상관이 없다면, 필요하지 않을 수도 있습니다. 그러나 다시, 나는 항상 그것이 엉성한 코딩이라고 주장한다. ;-)

은 (는)이 아니며, 어디에서 왔는지 매우 분명하지 않은 한 기존 트리에 추가하는 것입니다.

관련 문제