部分数据库客户端不支持一步IO,通用的方法是通过线程池实现
package com.didichuxing.streaming.flink;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.AsyncDataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.async.ResultFuture;
import org.apache.flink.streaming.api.functions.async.RichAsyncFunction;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.util.Collections;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class AsyncIOExample {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> source = env.fromElements("message1");
AsyncDataStream.unorderedWait(source, new FusionAsyncQueryFunction(), 1000, TimeUnit.MILLISECONDS, 100)
.print();
env.execute();
}
public static class FusionAsyncQueryFunction extends RichAsyncFunction<String, Tuple2<String, String>> {
private transient ExecutorService threadPool;
private transient JedisPool jedisPool;
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
threadPool = Executors.newFixedThreadPool(10);
jedisPool = new JedisPool(); // config
}
@Override
public void asyncInvoke(String input, ResultFuture<Tuple2<String, String>> resultFuture) throws Exception {
CompletableFuture.supplyAsync(() -> {
// all
try (Jedis jedis = jedisPool.getResource()) {
String result = jedis.get(input);
// do other things
return Tuple2.of(input, result);
} catch (Exception e) {
return null;
}
}, threadPool).thenAccept(result -> resultFuture.complete(Collections.singleton(result)));
}
@Override
public void close() throws Exception {
threadPool.shutdown();
jedisPool.close();
super.close();
}
}
}