一、需求:给定一个字符串,其中包含id字段,需从数据库解析相应的名称返回

二、核心代码:

public class QueryRelaDb {
    public static void main(String[] args) throws Exception {
        DataStreamSource<String> source = KafkaUtil.kafkaSource(args[0], args[1], args[2]);
        SingleOutputStreamOperator<Acitivity>  oper = source.map(new ActivityMapFunc());
        oper.print();
        KafkaUtil.getStreamExecutionEnvironment().execute("QueryRelaDb");
    }
}

ActivityMapFunc:

public class ActivityMapFunc extends RichMapFunction<String, Acitivity>{
    private static final long serialVersionUID = -5958085170167500655L;
    private Connection conn = null;
    
    @Override
    public void open(Configuration parameters) throws Exception {
        conn = DriverManager.getConnection("xxxx", "xdsu", "123456");
    }
    
    @Override
    public Acitivity map(String input) throws Exception {
        String[] splitStr = input.split(",");
        Long acitivityId = Long.parseLong(splitStr[1]);
        String name = null;
        PreparedStatement state = conn.prepareStatement("select activity_name from activity where activity_id = ?");
        state.setLong(1, acitivityId);
        ResultSet rs = state.executeQuery();
        if(rs.next()) {
            name = rs.getString(1);
        }
        rs.close();
        Acitivity acitivity = Acitivity.of(splitStr[0], acitivityId, name, splitStr[2]);
        return acitivity;
    }

    @Override
    public void close() throws Exception {
        if(conn != null) {
            conn.close();
        }
    }
}

KafkaUtil

public class KafkaUtil {
    private static StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    
    public static DataStreamSource<String> kafkaSource(String topic, String brokerList, String groupId) {
        Properties props = new Properties();
        //指定kafka的Broke地址
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);
        //指定组ID
        props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
        //如果没有记录偏移量,第一次从最开始消费
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        //kafka消费者自动提交偏移量
        props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");

        //KafkaSource
        FlinkKafkaConsumer<String> kafkaSource = new FlinkKafkaConsumer<String>(topic, new SimpleStringSchema(), props);
        return env.addSource(kafkaSource);
    }
    
    public static StreamExecutionEnvironment getStreamExecutionEnvironment() {
        return env;
    }
}

 三、异步实现方式

核心代码:

    public static void main(String[] args) throws Exception {
        DataStreamSource<String> source = KafkaUtil.kafkaSource(args[0], args[1], args[2]);
        SingleOutputStreamOperator<String>  oper = AsyncDataStream.unorderedWait(source, new AsyncActivityMapFunc(), 0, TimeUnit.MICROSECONDS);
        oper.print();
        KafkaUtil.getStreamExecutionEnvironment().execute("QueryRelaDb");
    }

AsyncActivityMapFunc:

public class AsyncActivityMapFunc extends RichAsyncFunction<String, String>{
    private static final long serialVersionUID = -5958085170167500655L;
    private transient ExecutorService executorService;
    private transient DruidDataSource dataSource;

    @Override
    public void open(Configuration parameters) throws Exception {
        executorService = Executors.newFixedThreadPool(10);
        dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("xxxxxxxxxxxx");
        dataSource.setUsername("xxx");
        dataSource.setPassword("xxx");
        dataSource.setMaxActive(50);
        dataSource.setMinIdle(10);
        dataSource.setInitialSize(5);
    }
    
    @Override
    public void asyncInvoke(String id, ResultFuture<String> resultFuture)
            throws Exception {
        Future<String> future = executorService.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                return queryFromMysql(id);
            }
        });
        CompletableFuture.supplyAsync(new Supplier<String>() {
            @Override
            public String get() {
                try {
                    return future.get();
                } catch (Exception e) {
                    return null;
                }
            }
        }).thenAccept(new Consumer<String>() {
            @Override
            public void accept(String activeName) {
                resultFuture.complete(Collections.singleton(activeName));
            }
        });
    }
    
    private String queryFromMysql(String id) throws Exception {
        String name = null;
        Connection conn = null;
        PreparedStatement state = null;
        ResultSet rs = null;
        try {
            conn = dataSource.getConnection();
            state = conn.prepareStatement("select activity_name from activity where activity_id = ?");
            state.setString(1, id);
            rs = state.executeQuery();
            if (rs.next()) {
                name = rs.getString(1);
            }
        } finally {
            rs.close();
            state.close();
            conn.close();
        }
        return name;
    }

    @Override
    public void close() throws Exception {
        if(executorService != null) {
            executorService.shutdown();
        }
        if(dataSource != null) {
            dataSource.close();
        }
    }
}