Эта программа вводит параллельное выполнение? - PullRequest
0 голосов
/ 08 марта 2010

Вот простое серверное приложение , использующее Bonjour и написанное на 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.
    }
}

Я понимаю это следующим образом. Мы можем попытаться зарегистрировать сервис, вызывающий метод «registerService», который, в свою очередь, вызывает метод «DNSSD.register». «DNSSD.register» пытается зарегистрировать сервис и, в общем случае, может привести к двум результатам: сервис «успешно зарегистрирован» и «регистрация не пройдена». В обоих случаях «DNSSD.register» вызывает соответствующий метод («serviceRegistered» или «operationFailed») объекта, который был передан DNSSD.register в качестве последнего аргумента. И программист решает, что поместить в «serviceRegistered» и «operationFailed». Это понятно.

Но стоит ли мне пытаться зарегистрировать сервис из "OperationFailed"? Я боюсь, что таким образом мое приложение будет пытаться зарегистрировать сервис слишком часто. Должен ли я положить «сон» или «пауза» в «операция отказала»? Но в любом случае, мне кажется, что, когда приложение не может зарегистрировать службу, оно также не может делать что-то еще (например, заботиться о GUI). Или может DNSSD.register ввести какой-то параллелизм? Я имею в виду, что он запускает новый поток, но если я попытаюсь зарегистрировать службу из «Неудачной операции», я могу создать огромное количество потоков. Это может случиться? Если это так, то должно ли это быть проблемой? И если это так, как я могу решить эту проблему?

1 Ответ

1 голос
/ 08 марта 2010

Да, обратные вызовы от API DNSSD могут поступать асинхронно из другого потока. Этот отрывок из книги О'Рейли о сети ZeroConf дает некоторую полезную информацию.

Я не уверен, что повторная попытка регистрации из вашей операции. Обратный вызов - хорошая идея. По крайней мере, не понимая, почему регистрация не удалась, просто имеет смысл повторить попытку с теми же параметрами?

...