HikariCP Controller Service

HikariCPControllerService - 3

Test코드 작성

test코드도 간단합니다.

controller service를 수행할 간단한 processor를 정의하고, 해당 processor를 이용해 controller service가 정상 동작하는지 확인하면됩니다.

Test를 위한 TestProcessor.java의 코드는 다음과 같습니다.

TestProcessor.java

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.apache.nifi.annotation.lifecycle.OnScheduled;
import org.apache.nifi.components.PropertyDescriptor;
import org.apache.nifi.processor.AbstractProcessor;
import org.apache.nifi.processor.ProcessContext;
import org.apache.nifi.processor.ProcessSession;
import org.apache.nifi.processor.exception.ProcessException;

public class TestProcessor extends AbstractProcessor {

    public static final PropertyDescriptor DS_PROP = new PropertyDescriptor.Builder().name("dbcp")
            .description("HikariCPService test processor").identifiesControllerService(HikariCPService.class)
            .required(true).build();

    @Override
    public void onTrigger(ProcessContext context, ProcessSession session) throws ProcessException {
    }

    @Override
    protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
        List<PropertyDescriptor> propDescs = new ArrayList<>();
        propDescs.add(DS_PROP);
        return propDescs;
    }

    @OnScheduled
    public void onScheduled(final ProcessContext context) {

        HikariCPService dbcpService = (HikariCPService) context.getProperty(DS_PROP).asControllerService();

        try (Connection conn = dbcpService.getConnection();
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery("values 1")) {

            while (rs.next()) {
                getLogger().info("Results : " + rs.getObject(1));
            }
        } catch (Exception e) {
            getLogger().error("Problem testing connection", e);
        }
    }
}

실제 테스트를 수행할 TestStandardHikariCPService class의 소스는 다음과 같습니다.

TestStandardHikariCPService.java

import java.io.PrintWriter;
import org.apache.derby.drda.NetworkServerControl;
import org.apache.derby.jdbc.ClientDataSource;
import org.apache.nifi.reporting.InitializationException;
import org.apache.nifi.util.TestRunner;
import org.apache.nifi.util.TestRunners;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class TestStandardHikariCPService {
  
  private static NetworkServerControl derby;
  
    @BeforeClass
    public static void init() throws Exception {
      derby = new NetworkServerControl();
      derby.start(new PrintWriter(System.out));
    }
    
    @AfterClass
    public static void stop() throws Exception {
      derby.shutdown();
    }
    
    @Test
    public void testService() throws InitializationException {
        final TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
        final StandardHikariCPService service = new StandardHikariCPService();
        runner.addControllerService("dbcp", service);
        
        runner.setProperty(service, ConfigUtil.DATASOURCE_CLASSNAME, ClientDataSource.class.getName());
        runner.setProperty(service, ConfigUtil.USERNAME, "test");
        runner.setProperty(service, ConfigUtil.PASSWORD, "test");
        runner.setProperty(service, ConfigUtil.AUTO_COMMIT, "true");
        runner.setProperty(service, ConfigUtil.METRICS, "true");
        
        runner.setProperty(service, "databaseName", "test");
        runner.setProperty(service, "createDatabase", "create");
        runner.setProperty(service, "serverName", "localhost");
        runner.setProperty(service, "portNumber", "1527");
        runner.enableControllerService(service);
        runner.setProperty(TestProcessor.DS_PROP, "dbcp");
        
        runner.run();

        runner.assertValid(service);
        runner.disableControllerService(service);
        runner.shutdown();
    }

}

Test 수행 결과 확인

Junit 테스트를 수행하고 결과를 확인했을때 다음과 같이 나오면 성공입니다.

HikariCP-Junit

로그에서도 정상적으로 HikariCP를 이용해 커넥션을 맺은 것을 확인할 수 있습니다.

HikariCP-Junit-log

NiFi 배포후 수행 결과 확인

이제 NiFi에 배포한 후에 기존에 만들었던 kaggle bitcoin history processor에서 DBCPservice를 hikariCP로 변경한 후에 정상적으로 수행되는지 확인합니다.

controller service를 활성화해줍니다.

HikariCP-controller-enable

기존 bitcoint history processor에서 dbcp를 방금 추가한 HikariCP로 변경합니다.

HikariCP-processor-property

수행후 db에 정상적으로 적재된 것을 확인할 수 있습니다.

HikariCP-success


변경사항은 아래에서 확인할 수 있습니다.

https://github.com/qnwlqnwlxm/HikariCPService/pull/3/files

전체소스는 아래 에서 다운로드 가능합니다. https://github.com/qnwlqnwlxm/HikariCPService/tree/HikariCPControllerSerivce-3