我正在尝试开发一个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
?