2010-03-08 2 views
0

여기는 simple server application using Bonjour and written in Java입니다. 코드의 주요 부분은 다음과 같습니다 :이 프로그램이 병렬 실행을 도입합니까?

public class ServiceAnnouncer implements IServiceAnnouncer, RegisterListener { 
    private DNSSDRegistration serviceRecord; 
    private boolean registered; 

    public boolean isRegistered(){ 
     return registered; 
    } 

    public void registerService() { 
     try { 
      serviceRecord = DNSSD.register(0,0,null,"_killerapp._tcp", null,null,1234,null,this); 
     } catch (DNSSDException e) { 
      // error handling here 
     } 
    } 

    public void unregisterService(){ 
     serviceRecord.stop(); 
       registered = false; 
    } 

    public void serviceRegistered(DNSSDRegistration registration, int flags,String serviceName, String regType, String domain){ 
     registered = true; 
    } 

    public void operationFailed(DNSSDService registration, int error){ 
     // do error handling here if you want to. 
    } 
} 

나는 이것을 다음과 같이 이해합니다. 우리는 차례로 "DNSSD.register"메소드를 호출하는 "registerService"메소드를 호출하는 서비스를 등록하려고 시도 할 수 있습니다. "DNSSD.register"는 서비스 등록을 시도하고 일반적으로 서비스가 "성공적으로 등록 됨"및 "등록 실패"라는 두 가지 결과로 끝날 수 있습니다. 두 경우 모두 "DNSSD.register"는 마지막 인수로 DNSSD.register에 주어진 객체의 해당 메소드 ("serviceRegistered"또는 "operationFailed")를 호출합니다. 그리고 프로그래머는 "serviceRegistered"와 "operationFailed"에 넣어야 할 것을 결정합니다. 그것은 분명합니다.

하지만 "operationFailed"에서 서비스를 등록해야합니까? 나는이 방법으로 내 신청서가 서비스를 너무 자주 등록하려고 시도 할까 봐 걱정된다. "sleep"또는 "pause"를 "operationFailed"에 넣어야합니까? 그러나 어쨌든 응용 프로그램이 서비스를 등록 할 수 없을 때 다른 것을 할 수 없게됩니다 (예를 들어 GUI를 처리하는 것처럼). 아니면 어떤 종류의 병렬 처리를 도입 한 DNSSD.register 일 수 있습니까? 나는 새로운 스레드를 시작하지만 "operation Failed"에서 서비스를 등록하려고하면 많은 수의 스레드를 생성 할 수 있습니다. 일어날 수 있습니까? 그것이 사실이라면, 그것은 문제가되어야합니까? 그리고 그것이 사실이라면 어떻게이 문제를 해결할 수 있습니까?

답변

1

예, DNSSD API의 콜백은 다른 스레드에서 비동기 적으로 올 수 있습니다. 이 exerpt from the O'Reilly book on ZeroConf networking은 유용한 정보를 제공합니다.

나는 당신의 operationFailed 콜백으로부터 등록을 재 시도하는 것이 좋은 생각입니다. 적어도 왜 등록이 실패했는지에 대한 약간의 이해가 없다면, 동일한 매개 변수를 사용하여 등록을 다시 시도하는 것입니까?