Java tutorial
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.datatorrent.lib.db.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.concurrent.Callable; import javax.validation.ConstraintViolationException; import org.junit.Assert; import org.junit.Test; import org.apache.hadoop.conf.Configuration; import com.datatorrent.api.Context; import com.datatorrent.api.DAG; import com.datatorrent.api.DefaultOutputPort; import com.datatorrent.api.InputOperator; import com.datatorrent.api.LocalMode; import com.datatorrent.api.StreamingApplication; import com.datatorrent.common.util.BaseOperator; import com.datatorrent.stram.StramLocalCluster; public class JdbcPojoOperatorApplicationTest extends JdbcOperatorTest { public static int TupleCount; public int getNumOfRowsinTable(String tableName) { Connection con; try { con = DriverManager.getConnection(URL); Statement stmt = con.createStatement(); String countQuery = "SELECT count(*) from " + tableName; ResultSet resultSet = stmt.executeQuery(countQuery); resultSet.next(); return resultSet.getInt(1); } catch (SQLException e) { throw new RuntimeException("fetching count", e); } } @Test public void testApplication() throws Exception { try { LocalMode lma = LocalMode.newInstance(); Configuration conf = new Configuration(false); conf.addResource(this.getClass().getResourceAsStream("/JdbcProperties.xml")); lma.prepareDAG(new JdbcPojoOperatorApplication(), conf); LocalMode.Controller lc = lma.getController(); lc.setHeartbeatMonitoringEnabled(false); ((StramLocalCluster) lc).setExitCondition(new Callable<Boolean>() { @Override public Boolean call() throws Exception { return getNumOfRowsinTable(TABLE_POJO_NAME) == 10; } }); lc.run(10000);// runs for 10 seconds and quits Assert.assertEquals("rows in db", 10, getNumOfRowsinTable(TABLE_POJO_NAME)); } catch (ConstraintViolationException e) { Assert.fail("constraint violations: " + e.getConstraintViolations()); } } public static class JdbcPojoOperatorApplication implements StreamingApplication { @Override public void populateDAG(DAG dag, Configuration configuration) { JdbcPOJOInsertOutputOperator jdbc = dag.addOperator("JdbcOutput", new JdbcPOJOInsertOutputOperator()); JdbcTransactionalStore outputStore = new JdbcTransactionalStore(); outputStore.setDatabaseDriver(DB_DRIVER); outputStore.setDatabaseUrl(URL); jdbc.setStore(outputStore); jdbc.setBatchSize(3); jdbc.setTablename(TABLE_POJO_NAME); dag.getMeta(jdbc).getMeta(jdbc.input).getAttributes().put(Context.PortContext.TUPLE_CLASS, TestPOJOEvent.class); cleanTable(); JdbcPojoEmitterOperator input = dag.addOperator("data", new JdbcPojoEmitterOperator()); dag.addStream("pojo", input.output, jdbc.input); } } public static class JdbcPojoEmitterOperator extends BaseOperator implements InputOperator { public static int emitTuple = 10; public final transient DefaultOutputPort<TestPOJOEvent> output = new DefaultOutputPort<TestPOJOEvent>(); @Override public void emitTuples() { if (emitTuple > 0) { output.emit(new TestPOJOEvent(emitTuple, "test" + emitTuple)); emitTuple--; TupleCount++; } } @Override public void setup(Context.OperatorContext context) { TupleCount = 0; } } }