Apache nifi 以编程方式读取Nifi计数器值
我正在开发一个自定义处理器,我想在其中读取Nifi计数器的值。除了使用Nifi Rest Api“”,还有其他读取计数器值的方法吗?没有。Apache Nifi没有任何直接的Api可用于以编程方式读取计数器值。一种简单的方法是使用Apache nifi 以编程方式读取Nifi计数器值,apache-nifi,Apache Nifi,我正在开发一个自定义处理器,我想在其中读取Nifi计数器的值。除了使用Nifi Rest Api“”,还有其他读取计数器值的方法吗?没有。Apache Nifi没有任何直接的Api可用于以编程方式读取计数器值。一种简单的方法是使用GetHTTP处理器并使用您提到的NiFi REST API URL:http://NiFi主机:端口/NiFi API/计数器 然后使用EvaluateJsonPath从GetHTTP处理器接收的JSON响应中解析并读取计数器值。否。Apache NiFi没有任何直接
GetHTTP
处理器并使用您提到的NiFi REST API URL:http://NiFi主机:端口/NiFi API/计数器
然后使用
EvaluateJsonPath
从GetHTTP
处理器接收的JSON响应中解析并读取计数器值。否。Apache NiFi没有任何直接的API可用于以编程方式读取计数器值。一种简单的方法是使用GetHTTP
处理器并使用您提到的NiFi REST API URL:http://NiFi主机:端口/NiFi API/计数器
然后使用
EvaluateJsonPath
从GetHTTP
处理器接收的JSON响应中解析和读取计数器值。虽然读取/写入计数器值不如修改流文件属性容易,但Apache NiFi确实有修改计数器的API。然而,计数器的目的是向人类用户提供信息,而不是让处理器根据其值做出决策。根据您试图实现的目标,您可能会更成功地使用本地地图或and。如果值仅与此处理器相关,则可以使用内存中的映射来存储和检索值。如果需要与其他处理器通信,请使用缓存()
Pierre Villard有,您可以使用来修改计数器值。由于计数器的设计不允许编程,因此无法从
RepositoryContext
对象检索CounterRepository
实例。你可能还想读一些关于这方面的文章,因为根据你的目标,这可能是实现它的更好的方法 虽然读/写计数器值不如修改flowfile属性容易,但apachenifi确实有修改计数器的api。然而,计数器的目的是向人类用户提供信息,而不是让处理器根据其值做出决策。根据您试图实现的目标,您可能会更成功地使用本地地图或and。如果值仅与此处理器相关,则可以使用内存中的映射来存储和检索值。如果需要与其他处理器通信,请使用缓存()
Pierre Villard有,您可以使用来修改计数器值。由于计数器的设计不允许编程,因此无法从
RepositoryContext
对象检索CounterRepository
实例。你可能还想读一些关于这方面的文章,因为根据你的目标,这可能是实现它的更好的方法 根据安迪的建议,我使用REFLECTION阅读了以下计数器:
private void printCounters(ProcessSession session) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Class standardProcessSession=session.getClass();
Field fieldContext = standardProcessSession.getDeclaredField("context");
fieldContext.setAccessible(true);
Object processContext = fieldContext.get(session);
Class processContextClass = processContext.getClass();
Field fieldCounterRepo = processContextClass.getDeclaredField("counterRepo");
fieldCounterRepo.setAccessible(true);
Object counterRepo = fieldCounterRepo.get(processContext);
Method declaredMethod = counterRepo.getClass().getDeclaredMethod("getCounters");
ArrayList<Object> counters = (ArrayList<Object>)declaredMethod.invoke(counterRepo);
for(Object obj:counters) {
Method methodName = obj.getClass().getDeclaredMethod("getName");
methodName.setAccessible(true);
Method methodVal = obj.getClass().getDeclaredMethod("getValue");
methodVal.setAccessible(true);
System.out.println("Counter name: "+methodName.invoke(obj));
System.out.println("Counter value: "+methodVal.invoke(obj));
}
}
private void打印计数器(ProcessSession会话)抛出NoSuchFieldException、SecurityException、IllegalArgumentException、IllegalAccessException、NoSuchMethodException、InvocationTargetException{
类standardProcessSession=session.getClass();
fieldContext=standardProcessSession.getDeclaredField(“上下文”);
fieldContext.setAccessible(true);
对象processContext=fieldContext.get(会话);
类processContextClass=processContext.getClass();
fieldCounterRepo=processContextClass.getDeclaredField(“counterRepo”);
fieldCounterRepo.setAccessible(真实);
Object counterRepo=fieldCounterRepo.get(processContext);
方法declaredMethod=counterRepo.getClass().getDeclaredMethod(“getCounters”);
ArrayList计数器=(ArrayList)declaredMethod.invoke(counterRepo);
用于(对象对象对象:计数器){
方法methodName=obj.getClass().getDeclaredMethod(“getName”);
methodName.setAccessible(true);
方法methodVal=obj.getClass().getDeclaredMethod(“getValue”);
methodVal.setAccessible(真);
System.out.println(“计数器名称:”+methodName.invoke(obj));
System.out.println(“计数器值:“+methodVal.invoke(obj));
}
}
注意:NIFI版本为1.5.0根据Andy的建议,我使用REFLECTION阅读计数器如下:
private void printCounters(ProcessSession session) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Class standardProcessSession=session.getClass();
Field fieldContext = standardProcessSession.getDeclaredField("context");
fieldContext.setAccessible(true);
Object processContext = fieldContext.get(session);
Class processContextClass = processContext.getClass();
Field fieldCounterRepo = processContextClass.getDeclaredField("counterRepo");
fieldCounterRepo.setAccessible(true);
Object counterRepo = fieldCounterRepo.get(processContext);
Method declaredMethod = counterRepo.getClass().getDeclaredMethod("getCounters");
ArrayList<Object> counters = (ArrayList<Object>)declaredMethod.invoke(counterRepo);
for(Object obj:counters) {
Method methodName = obj.getClass().getDeclaredMethod("getName");
methodName.setAccessible(true);
Method methodVal = obj.getClass().getDeclaredMethod("getValue");
methodVal.setAccessible(true);
System.out.println("Counter name: "+methodName.invoke(obj));
System.out.println("Counter value: "+methodVal.invoke(obj));
}
}
private void打印计数器(ProcessSession会话)抛出NoSuchFieldException、SecurityException、IllegalArgumentException、IllegalAccessException、NoSuchMethodException、InvocationTargetException{
类standardProcessSession=session.getClass();
fieldContext=standardProcessSession.getDeclaredField(“上下文”);
fieldContext.setAccessible(true);
对象processContext=fieldContext.get(会话);
类processContextClass=processContext.getClass();
fieldCounterRepo=processContextClass.getDeclaredField(“counterRepo”);
fieldCounterRepo.setAccessible(真实);
Object counterRepo=fieldCounterRepo.get(processContext);
方法declaredMethod=counterRepo.getClass().getDeclaredMethod(“getCounters”);
ArrayList计数器=(ArrayList)declaredMethod.invoke(counterRepo);
用于(对象对象对象:计数器){
方法methodName=obj.getClass().getDeclaredMethod(“getName”);
methodName.setAccessible(true);
方法methodVal=obj.getClass().getDeclaredMethod(“getValue”);
methodVal.setAccessible(真);
System.out.println(“计数器名称:”+methodName.invoke(obj));
System.out.println(“计数器值:“+methodVal.invoke(obj));
}
}
注意:NIFI版本是1.5.0你好,安迪,谢谢你的回复。我想尝试的是读取所有计数器值,并随时存储它们的状态。”调整