WS-Discovery с Apache CXF. Как указать тип устройства?

Я собираюсь использовать Apache CXF для ONVIF-совместимой службы IP-камер. Он использует WS-Discovery для поиска устройств и сервисов, а cxf поддерживает его " из коробки":

Jar cxf-services-ws-discovery-service зарегистрирует ServerLifecyleListener, который автоматически опубликует сообщения "Hello". Он также будет отвечать на любые запросы зондов, которые соответствуют опубликованным сервисам.

Как cxf определит тип устройства для отправки ProbeMatches ответ? Как я могу указать, что моим устройством является ip-камера (мне нужно установить конкретный тип устройства в ответе ProbeMatches, NetworkVideoTransmitter например)?

1 ответ

Решение

После просмотра исходного кода CXF (WSDiscoveryServiceImpl класс) я нашел ответ:

public ProbeMatchesType handleProbe(ProbeType pt) {
        List<HelloType> consider = new LinkedList<HelloType>(registered);
        //step one, consider the "types"
        //ALL types in the probe must be in the registered type
        if (pt.getTypes() != null && !pt.getTypes().isEmpty()) {
            ListIterator<HelloType> cit = consider.listIterator();
            while (cit.hasNext()) {
                HelloType ht = cit.next();
                boolean matches = true;
                for (QName qn : pt.getTypes()) {
                    if (!ht.getTypes().contains(qn)) {
                        matches = false;
                    }
                }
                if (!matches) {
                    cit.remove();
                }
            }
        }
        //next, consider the scopes
        matchScopes(pt, consider);

        if (consider.isEmpty()) {
            return null;
        }
        ProbeMatchesType pmt = new ProbeMatchesType();
        for (HelloType ht : consider) {
            ProbeMatchType m = new ProbeMatchType();
            m.setEndpointReference(ht.getEndpointReference());
            m.setScopes(ht.getScopes());
            m.setMetadataVersion(ht.getMetadataVersion());
            m.getTypes().addAll(ht.getTypes());
            m.getXAddrs().addAll(ht.getXAddrs());
            pmt.getProbeMatch().add(m);
        }
        return pmt;
    }

Вкратце - он перебирает опубликованные сервисы и сравнивает QNames. Если искомое имя найдено в опубликованном, оно добавляется в ProbeMatch, Поэтому я должен внедрить и опубликовать сервис с необходимым QName, чтобы это исправить.

Другие вопросы по тегам