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, чтобы это исправить.