简体   繁体   中英

NiFI :- Failed to create Extension Definition for CONTROLLER_SERVICE org.apache.nifi.record.sink.lookup.RecordSinkServiceLookup

I'm trying to use DBCPConnectionPool service in my custom processor. So, how to use in-built controller services (which are already available on NiFi) in our custom processors.

Here are my properties in *-nar/->pom.xml

    <dependencies>
        <dependency>
            <groupId>org.sample.com</groupId>
            <artifactId>nifi-customprocessor-processors</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.nifi</groupId>
            <artifactId>nifi-standard-services-api-nar</artifactId>
            <version>1.14.0</version>
            <type>nar</type>
        </dependency>
    </dependencies>

Here are my dependencies in *processors/->pom.xml

    <dependency>
            <groupId>org.apache.nifi</groupId>
            <artifactId>nifi-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.nifi</groupId>
            <artifactId>nifi-utils</artifactId>
            <version>1.14.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.nifi</groupId>
            <artifactId>nifi-mock</artifactId>
            <version>1.14.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.nifi</groupId>
            <artifactId>nifi-dbcp-service</artifactId>
            <version>1.14.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.nifi</groupId>
            <artifactId>nifi-dbcp-service-api</artifactId>
            <version>1.14.0</version>
        </dependency>

And here is my propertydescriptor for DBCPConnetionPool service :-

public static final PropertyDescriptor DBCPConnectionPool_SERVICE = new PropertyDescriptor.Builder()
            .name("DBCPConnectionPoolLookup Service")
            .description("The Controller Service to use in order to establish a connection")
            .required(true)
            .dynamic(true)
            .identifiesControllerService(DBCPService.class)
            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
            .build();

and in my OnTrigger method I didn't used it as :-

DBCPService DBCPService = context.getProperty(DBCPConnectionPool_SERVICE)
                .asControllerService(DBCPService.class);

Connection con = DBCPService.getConnection();

and was trying to use this con object as in regular passion createStatement->executeQuery.

When I tried to package it using mvn clean install it started throwing error as : A required class was missing while executing org.apache.nifi:nifi-nar-maven-plugi n:1.3.1:nar: org/apache/nifi/record/sink/RecordSinkService then I added the following dependencies in processors/->pom.xml

    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-record-sink-service</artifactId>
        <version>1.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.nifi</groupId>
        <artifactId>nifi-record-sink-api</artifactId>
        <version>1.14.0</version>
    </dependency>

This time it was new error as :- Failed to create Extension Definition for CONTROLLER_SERVICE org.apache.nifi.record.sink.lookup.RecordSinkServiceLookup: Null PointerException

I also checked by commenting out code which I have written, to check the way I'm using that property was wrong but, even that didn't worked.:-

DBCPService DBCPService = context.getProperty(DBCPConnectionPool_SERVICE)
                .asControllerService(DBCPService.class);

Connection con = DBCPService.getConnection();

Can someone help me out in order to use DBCPConnectionPoolService controller service in my custom processor?

I had the same issues the other day and I solved it by using AbstractControllerService instead of DBCPConnectionPool therefore not needing org.apache.nifi.dbcp.DBCPService anymore. Therefore my code would look like this:

MyService DBCPService = context.getProperty(DBCPConnectionPool_SERVICE)
                .asControllerService(MyService.class);

Connection con = DBCPService.getConnection();

MyService is the custom interface that extends ControllerService.(you have to use it when you also define the PropertyDescriptor DBCPConnectionPool_SERVICE )

And StandardMyService the class that extends AbstractControllerService and implements MyService and getConnection() from it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM