如何从依赖项使用控制器服务API

时间:2019-04-23 13:03:53

标签: apache-nifi

我有一个自定义控制器服务,我想与ConnectWebSocket处理器一起使用。控制器服务取决于nifi-websocket-services-api,不需要自定义api(my-customer-controller-service-api文件夹为空)。我已经为控制器服务编写了一个测试,并且测试通过了。

但是我无法选择控制器服务,因为ConnectWebSocket仅接受来自nifi-websocket-service-api-nar的控制器服务api。

enter image description here

我想避免重新编码整个ConnectWebSocket处理器。所以我的问题是:

是否可以配置依赖项,以便我的自定义控制器服务使用来自nifi-websocket-service-api-nar的api?

controller-service的pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>com.mydomain</groupId>
    <artifactId>nifi-controllerservice-bundle</artifactId>
    <version>1.9.2</version>
</parent>

<artifactId>nifi-controllerservice</artifactId>
<packaging>jar</packaging>

<dependencies>

    <!-- normal dependencies -->

    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-api</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-processor-utils</artifactId>
        <version>1.9.2</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-websocket-services-api</artifactId>
        <version>1.9.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-websocket-services-jetty</artifactId>
        <version>1.9.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-ssl-context-service-api</artifactId>
        <scope>provided</scope>
    </dependency>

    <!-- Test dependencies -->
</dependencies>

controller-service-nar的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.mydomain</groupId>
        <artifactId>nifi-controllerservice-bundle</artifactId>
        <version>1.9.2</version>
    </parent>

    <artifactId>nifi-controllerservice-nar</artifactId>
    <version>1.9.2</version>
    <packaging>nar</packaging>
    <properties>
        <maven.javadoc.skip>true</maven.javadoc.skip>
        <source.skip>true</source.skip>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.mydomain</groupId>
            <artifactId>nifi-controllerservice</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.nifi</groupId>
            <artifactId>nifi-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.nifi</groupId>
            <artifactId>nifi-websocket-services-jetty</artifactId>
            <version>1.9.2</version>
            <scope>nar</scope>
        </dependency>
    </dependencies>

</project>

root pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-nar-bundles</artifactId>
        <version>1.9.2</version>
    </parent>

    <groupId>com.mydomain</groupId>
    <artifactId>nifi-controllerservice-bundle</artifactId>
    <version>1.9.2</version>
    <packaging>pom</packaging>

    <modules>
        <module>nifi-comtom</module>
        <module>nifi-comtom-nar</module>
    </modules>

</project>

1 个答案:

答案 0 :(得分:2)

这应该是处理器和控制器服务的标准工作方式...

处理器依赖于来自服务API NAR的接口,控制器服务实现实现该接口。然后,框架知道该接口的所有实现,从而可以提供可能使用的服务。

在没有看到项目和poms的情况下,很难说出问题是什么,但很可能是依赖性问题。您的项目结构应该有两个Maven模块,一个为您的服务impl生成一个jar,然后将其称为一个定制服务,然后一个打包了NAR的模块,将其称为custom-service-nar。

自定义服务模块应该提供对nifi-websocket-services-api的依赖关系,这可以使其编译,但是我们不希望捆绑该API,因为在运行时它将来自另一个NAR。

custom-service-nar模块在nifi-websocket-services-api-nar上应具有NAR类型的依赖项。

https://cwiki.apache.org/confluence/display/NIFI/Maven+Projects+for+Extensions#MavenProjectsforExtensions-LinkingProcessorsandControllerServices