将多个Cassandra分区转换为Akka流

时间:2017-02-03 09:02:14

标签: java cassandra akka akka-stream

我正在尝试开发一个Source,将一组cassandra分区转换为这样的Akka流(我通过绑定语句执行多个cassandra查询,每个分区一个,然后我mapConcat结果成为可迭代的DTO):

Source<Result<JournalEntry>, NotUsed> src = Source.unfoldAsync(queryBag, s -> {

    BoundStatement bound = getBoundStatement(queryBag);

    // get out data from cassandra:
    Future<Result<JournalEntry>> page = 
        Future.apply(() -> journalMapper.map(session.execute(bound)), ec);

    Future<Optional<Pair<QueryBag,Result<JournalEntry>>>> next = page.map(r -> {
        Optional<Pair<QueryBag,Result<JournalEntry>>> opt;
        if (r.isExhausted()) {
            opt = Optional.empty();
        } else {
            opt = Optional.of(Pair.apply(queryBag.incrementPartitionId(), r));
        }
        return opt;
    }, ec);
    return FutureConverters.toJava(next);
});

Source<JournalEntry, NotUsed> concat = src.mapConcat(res -> () -> res.iterator());

// materialize concat and consume the stream

这是安全的做法吗?特别是,我关注通过mapConcat((res) -> () -> res.iterator())生成可迭代,因为生成的iterator()的{​​{1}}方法的多次调用将获得迭代器的相同实例。

此外,这是一种在不同的cassandra分区中迭代的合理方法,还是更适合使用Iterable

0 个答案:

没有答案