Apache Flink:如何使用SourceFunction以指定的时间间隔执行任务?

时间:2018-10-23 17:32:57

标签: apache-flink flink-streaming flink-cep

我需要我的flink作业以指定的时间间隔从数据库中提取记录,并在处理后将其存档。我已经实现了SourceFunction以从数据库中获取所需的记录,并将SourceFunction添加为StreamExecutionEnvironment的源。如何指定每10分钟使用SourceFunction通过StreamExecutionEnvironment从数据库中获取记录?

SourceFunction:

public class MongoDBSourceFunction implements SourceFunction<List<Book>>{

    public void cancel() {
        // TODO Auto-generated method stub
    }

    public void run(org.apache.flink.streaming.api.functions.source.SourceFunction.SourceContext
<List<Book>> context) throws Exception {

        List<Book> books = getBooks();

        context.collect(books);

    }

    public List<Book> getBooks() {
        List<Book> books = new ArrayList<Book>();

        //fetch all books from database     
        return books;
    }

}

处理器:

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class ArchiveJob {

    public static void main(String[] args) {

        final StreamExecutionEnvironment env = 
    StreamExecutionEnvironment.getExecutionEnvironment();

        env.addSource(new MongoDBSourceFunction()).print();
    }

}

1 个答案:

答案 0 :(得分:2)

您需要将此功能添加到MongoDBSourceFunction本身。例如,您可以在ScheduledExecutorService方法中实例化一个open并使用该执行程序安排读取任务。

请注意,在发出记录时保持检查点锁定很重要。