Java nifi禁用的控制器服务rest api调用失败

Java nifi禁用的控制器服务rest api调用失败,java,resttemplate,apache-nifi,Java,Resttemplate,Apache Nifi,我正在使用spring4.2.0和nifi 0.6.0,当我为禁用的nifi控制器服务使用restemplate调用restfulapi时 //get nifi revision public RevisionDTO getRevision() { Entity revision = restTemplate.getForObject("http://localhost:8083/nifi-api//controller/revision", Entity.class); ret

我正在使用
spring4.2.0
nifi 0.6.0
,当我为禁用的nifi控制器服务使用restemplate调用restfulapi时

//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);
}
nifi测井

2016-04-11 16:32:53982调试[NiFi Web Server-90-/NiFi api/控制器/控制器服务/node/5d99ca33-78f6-465e-9ab1-8c7cb5650025]o.a.n.w.标准优化锁定管理器版本检查失败,因为当前版本为[23,5d4fe4d3-2f32-4a75-899a-458e8e62efce],但提供的版本为[null,15976fcf-e01b-483c-994b-df812293d7ad]
......
2016-04-11 16:32:53990调试[NiFi Web Server-90-/NiFi api/controller/controller services/node/5d99ca33-78f6-465e-9ab1-8c7cb5650025]c.s.j.spi.container.ContainerResponse响应的映射异常:409(冲突)
org.apache.nifi.web.InvalidRevisionException:此nifi实例已由“匿名”更新。请刷新以同步视图。
在org.apache.nifi.web.standardpoptimisticlockingmanager.checkRevision(standardpoptimisticlockingmanager.java:62)~[nifi-web-optimistic-locking-0.6.0.jar:0.6.0]
在org.apache.nifi.web.StandardOptimisticLockingManager.configureFlow(StandardOptimisticLockingManager.java:80)~[nifi-web-optimistic-locking-0.6.0.jar:0.6.0]
在org.apache.nifi.web.standardinfiservicefacade.updateControllerService(standardinfiservicefacade.java:1714)~[classes/:0.6.0]
在org.apache.nifi.web.StandardNiFiServiceFacade$$FastClassBySpringCGLIB$$358780e0.invoke()~[classes/:0.6.0]

有没有办法修复这个错误

@Matt Gilman我通过两种方式更改了
禁用功能:

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);
}
已解决

我比较浏览器禁用请求并再次读取api文档,发现禁用控制器服务必须遵循以下步骤:

  • 停止控制器服务引用
  • 禁用控制器服务引用
  • 设置控制器服务禁用状态
  • 现在我的新禁用功能是

    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);
    }
    
    private void disable(ControllerService实体cs){
    //http表单
    HttpHeaders requestHeaders=新的HttpHeaders();
    requestHeaders.setContentType(MediaType.APPLICATION\u FORM\u URLENCODED);
    //停止控制器服务引用
    多值映射urlVar=getRevisionUrl(getRevision());
    urlVar.add(“state”,state_STOPPED);
    HttpEntity requestEntity=新的HttpEntity(urlVar,requestHeaders);
    restemplate.put(url()+cs.getControllerService().getId()+“/references”,requestEntity);
    //禁用控制器服务引用
    urlVar=getRevisionUrl(getRevision());
    requestEntity=新的HttpEntity(urlVar,requestHeaders);
    添加(“状态”,禁用状态);
    restemplate.put(url()+cs.getControllerService().getId()+“/references”,requestEntity);
    //设置控制器服务禁用状态
    urlVar=getRevisionUrl(getRevision());
    requestEntity=新的HttpEntity(urlVar,requestHeaders);
    添加(“状态”,禁用状态);
    restTemplate.put(url()+cs.getControllerService().getId(),requestEntity);
    }
    
    收到您的请求时,似乎未解释修订。我以前见过一次,当请求的内容类型设置不正确时,结果是修订没有正确解析

    我不太熟悉RestTemplate,但来自浏览器开发工具的请求的内容类型为
    application/x-www-form-urlencoded
    。能否检查RestTemplate是否发出相同类型的请求

    或者,您可以直接使用对象的属性发出请求,并使用
    application/json
    。这里有一点不同的是,使用客户机DTO设置处理器调度状态的示例[1]

    此外,在本文的底部是修订用例的伟大序列图[2]

    [1]


    [2]

    我以两种方式更改了禁用功能,但出现了另一个错误:DBCPConnectionPool[id=fecc88a8-379d-4fb3-b880-28c5f5caef23]无法更新,因为它未被禁用
    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]
    
    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);
    }