2016-04-11 2 views
4

Я использую spring 4.2.0 и nifi 0.6.0, когда я использую RestTemplate вызова RESTful API для контроллера Отключенных Nifi вNifi инвалиды контроллер-услуга остальной апите Сбой вызова

//get nifi revision 
public RevisionDTO getRevision() { 
    Entity revision = restTemplate.getForObject("http://localhost:8083/nifi-api//controller/revision", Entity.class); 
    return revision.getRevision(); 
} 

//http parameter 
protected Map<String, Object> getRevisionUrl(RevisionDTO revision) { 
    Map<String, Object> urlVar = new HashMap<String, Object>(); 
    urlVar.put("version", revision.getVersion()); 
    urlVar.put("clientId", revision.getClientId()); 
    return urlVar; 
} 

//disable controller service 
private void disable(ControllerServiceEntity cs) { 
    Map<String, Object> urlVar = getRevisionUrl(getRevision()); 
    urlVar.put("state", STATE_DISABLED); 
    restTemplate.put("http://localhost:8083/nifi-api/controller/controller-services/node/" + cs.getControllerService().getId(), null, urlVar); 
} 

я получил следующий журнал ошибок:

org.springframework.web.client.HttpClientErrorException: 409 Conflict 
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) 
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:636) 
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:592) 
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:560) 

Nifi войти

2016-04-11 16:32:53,982 DEBUG [NiFi Web Server-90 - /nifi-api/controller/controller-services/node/5d99ca33-78f6-465e-9ab1-8c7cb5650025] o.a.n.w.StandardOptimisticLockingManager Revision check failed because current revision is [23, 5d4fe4d3-2f32-4a75-899a-458e8e62efce] but supplied revision is [null, 15976fcf-e01b-483c-994b-df812293d7ad] ...... 2016-04-11 16:32:53,990 DEBUG [NiFi Web Server-90 - /nifi-api/controller/controller-services/node/5d99ca33-78f6-465e-9ab1-8c7cb5650025] c.s.j.spi.container.ContainerResponse Mapped exception to response: 409 (Conflict) org.apache.nifi.web.InvalidRevisionException: This NiFi instance has been updated by 'anonymous'. Please refresh to synchronize the view. at org.apache.nifi.web.StandardOptimisticLockingManager.checkRevision(StandardOptimisticLockingManager.java:62) ~[nifi-web-optimistic-locking-0.6.0.jar:0.6.0] at org.apache.nifi.web.StandardOptimisticLockingManager.configureFlow(StandardOptimisticLockingManager.java:80) ~[nifi-web-optimistic-locking-0.6.0.jar:0.6.0] at org.apache.nifi.web.StandardNiFiServiceFacade.updateControllerService(StandardNiFiServiceFacade.java:1714) ~[classes/:0.6.0] at org.apache.nifi.web.StandardNiFiServiceFacade$$FastClassBySpringCGLIB$$358780e0.invoke() ~[classes/:0.6.0]

browser call disabled api screenshot

Есть ли способ исправить ошибку?

Гилман я @ Matt изменили disable функцию двумя способами:

private void disable(ControllerServiceEntity cs) { 
    //http form 
    /*MultiValueMap<String, String> urlVar = getRevisionUrl(getRevision()); 
    urlVar.add("state", STATE_DISABLED); 

    HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 
    HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(urlVar, requestHeaders);*/ 

    //http json 
    ControllerServiceEntity csu = new ControllerServiceEntity(); 
    csu.setRevision(getRevision()); 
    csu.setControllerService(cs.getControllerService()); 
    csu.getControllerService().setState(STATE_DISABLED); 
    HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.setContentType(MediaType.APPLICATION_JSON); 
    HttpEntity<String> requestEntity = new HttpEntity<String>(JSONUtils.obj2json(csu), requestHeaders); 

    restTemplate.put(url() + cs.getControllerService().getId(), requestEntity); 
} 

, но я получил ту же ошибку в НИФИ:

java.lang.IllegalStateException: DBCPConnectionPool[id=fecc88a8-379d-4fb3-b880-28c5f5caef23] cannot be updated because it is not disabled 
at org.apache.nifi.controller.service.StandardControllerServiceNode.verifyCanUpdate(StandardControllerServiceNode.java:217) ~[nifi-framework-core-0.6.0.jar:0.6.0] 
at org.apache.nifi.web.dao.impl.StandardControllerServiceDAO.verifyUpdate(StandardControllerServiceDAO.java:225) ~[classes/:na] 
at org.apache.nifi.web.dao.impl.StandardControllerServiceDAO.updateControllerService(StandardControllerServiceDAO.java:101) ~[classes/:na] 

решена

я сравнить браузер Disable запросить и прочитать api doc снова, найти отключить службу контроллера необходимо выполнить следующие действия:

  1. справочной служба остановки контроллера
  2. отключить сервис управления ссылкой
  3. сервисного набор контроллера отключить состояние

теперь мой новый отключить функция

private void disable(ControllerServiceEntity cs) { 
    //http form 
    HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 

    //stop controller service reference 
    MultiValueMap<String, String> urlVar = getRevisionUrl(getRevision()); 
    urlVar.add("state", STATE_STOPPED); 
    HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(urlVar, requestHeaders); 
    restTemplate.put(url() + cs.getControllerService().getId() + "/references", requestEntity); 

    //disable controller service reference 
    urlVar = getRevisionUrl(getRevision()); 
    requestEntity = new HttpEntity<MultiValueMap<String, String>>(urlVar, requestHeaders); 
    urlVar.add("state", STATE_DISABLED); 
    restTemplate.put(url() + cs.getControllerService().getId() + "/references", requestEntity); 

    //set controller service disable state 
    urlVar = getRevisionUrl(getRevision()); 
    requestEntity = new HttpEntity<MultiValueMap<String, String>>(urlVar, requestHeaders); 
    urlVar.add("state", STATE_DISABLED); 
    restTemplate.put(url() + cs.getControllerService().getId(), requestEntity); 
} 

ответ

3

Оказывается пересмотр не интерпретируется при получении вашего запроса. Я видел это раньше, когда Content-Type запроса был установлен неправильно, и в результате ревизия не была должным образом разобрана.

Я не очень хорошо знаком с RestTemplate, но запрос, поступающий из инструментов разработчика вашего браузера, имеет Content-Type application/x-www-form-urlencoded. Можете ли вы проверить, что RestTemplate выдаёт тот же тип запроса?

В качестве альтернативы вы можете отправить запрос с использованием объекта непосредственно и использовать application/json. Хотя здесь немного отличается, это пример установки состояния планирования процессора с использованием клиентских DTO [1].

Кроме того, в нижней части этой статьи представлена ​​большая диаграмма последовательности варианта использования ревизии [2].

[1] https://github.com/apache/nifi/blob/master/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/integration/accesscontrol/DfmAccessControlTest.java#L423

[2] https://community.hortonworks.com/content/kbentry/3160/update-nifi-flow-on-the-fly-via-api.html

+0

я изменил функцию отключения двумя способами, но получил другую ошибку: DBCPConnectionPool [ID = fecc88a8-379d-4fb3-b880-28c5f5caef23] не может быть обновлен потому что он не отключен – overfight

+0

Я понимаю, спасибо за помощь. – overfight