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);
}