Java Apache Nifi属性描述符的dynamicallyModifiesClasspath()的Hello world程序不工作
我有一个处理器,它依赖于某个jar作为依赖项。但是,对依赖项jar的更改非常频繁。因此,我希望能够将jar路径指定为处理器的属性,并让nifi在每次修改属性中的路径并重新启动处理器时加载jar。如中所述,这应该是可行的。然而,我无法做到这一点。下面是我使用dynamicallyModifiesClasspath属性编写的hello world程序代码: 下面,Djl代表动态jar加载,我猜这个helloworld程序的名字是一个随机前缀 DjlDependencyClass.java 这是我的nifi处理器所依赖的类,我想在我的nifi处理器中动态更改它的jar路径Java Apache Nifi属性描述符的dynamicallyModifiesClasspath()的Hello world程序不工作,java,apache-nifi,Java,Apache Nifi,我有一个处理器,它依赖于某个jar作为依赖项。但是,对依赖项jar的更改非常频繁。因此,我希望能够将jar路径指定为处理器的属性,并让nifi在每次修改属性中的路径并重新启动处理器时加载jar。如中所述,这应该是可行的。然而,我无法做到这一点。下面是我使用dynamicallyModifiesClasspath属性编写的hello world程序代码: 下面,Djl代表动态jar加载,我猜这个helloworld程序的名字是一个随机前缀 DjlDependencyClass.java 这是我的n
public class DjlDependencyClass {
public static String getMessage()
{
return "DJL-DEPENDENCY VERSION-1";
}
}
MyDjlProcessor.java
这是nifi处理器,它依赖于DjlDependencyClass
import org.apache.nifi.annotation.lifecycle.OnScheduled;
import org.apache.nifi.components.PropertyDescriptor;
import org.apache.nifi.processor.exception.ProcessException;
import org.apache.nifi.processor.AbstractProcessor;
import org.apache.nifi.processor.ProcessContext;
import org.apache.nifi.processor.ProcessSession;
import org.apache.nifi.processor.ProcessorInitializationContext;
import org.apache.nifi.processor.Relationship;
import org.apache.nifi.processor.util.StandardValidators;
import com.mycompany.djldependency.DjlDependencyClass;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class MyDjlProcessor extends AbstractProcessor {
public static final Relationship MY_RELATIONSHIP = new Relationship.Builder()
.name("MY_RELATIONSHIP")
.description("Example relationship")
.build();
public static final PropertyDescriptor pathToDjlDependencyJar = new PropertyDescriptor.Builder()
.name("Djl Dependency JAR")
.description("Djl Dependency JAR")
.required(true)
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
.dynamicallyModifiesClasspath(true)
.expressionLanguageSupported(true)
.build();
private List<PropertyDescriptor> descriptors;
private Set<Relationship> relationships;
@Override
protected void init(final ProcessorInitializationContext context) {
final List<PropertyDescriptor> descriptors = new ArrayList<PropertyDescriptor>();
descriptors.add(pathToDjlDependencyJar);
this.descriptors = Collections.unmodifiableList(descriptors);
final Set<Relationship> relationships = new HashSet<Relationship>();
relationships.add(MY_RELATIONSHIP);
this.relationships = Collections.unmodifiableSet(relationships);
}
@Override
public Set<Relationship> getRelationships() {
return this.relationships;
}
@Override
public final List<PropertyDescriptor> getSupportedPropertyDescriptors() {
return descriptors;
}
@OnScheduled
public void onScheduled(final ProcessContext context) {
}
@Override
public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException {
System.out.println(DjlDependencyClass.getMessage());
}
}
我正在按如下方式测试此处理器:
处理器的配置:
我得到以下例外情况:
2019-05-27 17:01:54,536 ERROR [Timer-Driven Process Thread-1] com.mycompany.djl.MyDjlProcessor MyDjlProcessor[id=f8fa5750-016a-1000-ecc3-c19732119332] MyDjlProcessor[id=f8fa5750-016a-1000-ecc3-c19732119332] failed to process due to java.lang.NoClassDefFoundError: com/mycompany/djldependency/DjlDependencyClass; rolling back session: {}
java.lang.NoClassDefFoundError: com/mycompany/djldependency/DjlDependencyClass
at com.mycompany.djl.MyDjlProcessor.onTrigger(MyDjlProcessor.java:76)
at org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)
at org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1122)
at org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:147)
at org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:47)
at org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:128)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
我在做什么蠢事吗
请下载项目nifi和依赖项jar。PropertyDescriptor的API文档提到以下注意事项:
如果组件包含dynamicallyModifiesClasspath设置为true的PropertyDescriptor,则还必须使用@RequiresInstanceClassloading对该组件进行注释,否则该组件将被视为无效
我不确定“无效”部分是否仍然有效,但是的,在更新处理器代码并使用@RequiresInstanceClassloading对其进行注释后,我能够使其正常工作。为什么指定目录而不是jar作为类路径参数值?“…\djl”文件夹中有什么?实际上,我尝试同时指定了这两个文件夹。我将djl-dependency-0.0.1-SNAPSHOT.jar保存在C:\Mahesh\delete\djl中。然后,首先我尝试将processor属性设置为C:\Mahesh\delete\djl。它不起作用。然后我尝试将属性设置为C:\Mahesh\delete\djl\djl-dependency-0.0.1-SNAPSHOT.jar。仍然没有工作。@daggett任何指针,请我只是知道,有标准处理器使用此功能。例如:尝试动态类加载而不是静态加载您的意思是仅仅执行@RequiresInstanceClassLoading公共类MyDjlProcessor extends AbstractProcessor{..}使其工作吗?不为我工作。我正在使用NiFi版本1.5.0。这可能是一个问题吗?您确定仅仅用@RequiredInstanceClassLoading注释处理器就可以工作吗?我刚才在评论中提到了daggett的标准JoltTransformRecord处理器。未使用@requireInstanceClassLoading对该进程进行注释。但正如您所指出的,doc说处理器应该用@RequiresInstanceClassLoading注释。这个版本是特定的吗?我在nifi 1.5.0上。您能提供您的设置/环境规格吗?非常抱歉延迟响应。将在今天的某个时候与您共享代码。
2019-05-27 17:01:54,536 ERROR [Timer-Driven Process Thread-1] com.mycompany.djl.MyDjlProcessor MyDjlProcessor[id=f8fa5750-016a-1000-ecc3-c19732119332] MyDjlProcessor[id=f8fa5750-016a-1000-ecc3-c19732119332] failed to process due to java.lang.NoClassDefFoundError: com/mycompany/djldependency/DjlDependencyClass; rolling back session: {}
java.lang.NoClassDefFoundError: com/mycompany/djldependency/DjlDependencyClass
at com.mycompany.djl.MyDjlProcessor.onTrigger(MyDjlProcessor.java:76)
at org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)
at org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1122)
at org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:147)
at org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:47)
at org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:128)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)