Flink自定义source 需要实现 SourceFunction(并行度1) ,ParallelSourceFunction(多并行),RichParallelSourceFunction(多并行)。这里使用的RichParallelSourceFunction(多并行)。实时取消费redis队列。
代码实现:
//主类
public class CreOdsMain {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//添加数据源
DataStreamSource<String> sourceRm7896Top0 = env.addSource(new ReidsSourceFunctionRm7896Top0());
sourceRm7896Top0.print();
env.execute();
}
}
//自定义source类
public class ReidsSourceFunctionRm7896Top0 extends RichParallelSourceFunction<String> {
private JedisPool jedispool = null;
private Boolean isRunning = true;
private Logger logger = LoggerFactory.getLogger(ReidsSourceFunctionRm7896Top0.class);
@Override
public void open(Configuration parameters) throws Exception {
jedispool = RedisPoolCache.getPool("rm7896");
}
@Override
public void run(SourceContext<String> ctx) throws Exception {
Jedis jedis = null;
while (isRunning){
try {
jedis = jedispool.getResource();
jedis.select(12);
List<String> brpop = jedis.brpop(0, "newsapp_top_0");
ctx.collect(brpop.get(1));
}catch (Exception e){
logger.error("Exception:{}.", ExceptionUtils.getFullStackTrace(e));
}finally {
try {
if (jedis!=null) {
jedis.close();
}
} catch (Exception q) {
logger.error("Exception:{}.", ExceptionUtils.getFullStackTrace(q));
}
}
}
}
@Override
public void cancel() {
isRunning = false;
}
}