首页 > 解决方案 > 如何使用依赖项中的控制器服务 api

问题描述

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

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

在此处输入图像描述

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

是否可以配置依赖项,以便我的自定义控制器服务使用来自的 api nifi-websocket-service-api-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</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>

控制器服务 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>

根 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>

标签: apache-nifi

解决方案


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

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

如果没有看到您的项目和 poms,很难说出问题所在,但很可能是依赖问题。您的项目结构应该有两个 Maven 模块,一个为您的服务 impl 生成一个 jar,我们称之为自定义服务,然后一个打包 NAR,我们称之为自定义服务-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


推荐阅读