Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Nifi属性描述符的dynamicallyModifiesClasspath()的Hello world程序不工作_Java_Apache Nifi - Fatal编程技术网

Java Apache Nifi属性描述符的dynamicallyModifiesClasspath()的Hello world程序不工作

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

我有一个处理器,它依赖于某个jar作为依赖项。但是,对依赖项jar的更改非常频繁。因此,我希望能够将jar路径指定为处理器的属性,并让nifi在每次修改属性中的路径并重新启动处理器时加载jar。如中所述,这应该是可行的。然而,我无法做到这一点。下面是我使用dynamicallyModifiesClasspath属性编写的hello world程序代码:

下面,Djl代表动态jar加载,我猜这个helloworld程序的名字是一个随机前缀

DjlDependencyClass.java

这是我的nifi处理器所依赖的类,我想在我的nifi处理器中动态更改它的jar路径

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)