假设:
AtoB: GraphStageWithMaterializedValue[A, B, Future[AtoBRuntimeApi]]
;
BtoC: GraphStageWithMaterializedValue[B, C, Future[BtoCRuntimeApi]]
。
通缉: AtoC: GraphStageWithMaterializedValue[A, C, Future[AtoCRuntimeApi]]
。
在我的特定情况下,根据AtoCRuntimeApi
和AtoBRuntimeApi
实施BtoARuntimeApi
非常方便。
所以我想将AtoCRuntimeApi
定义为case class AtoCRuntimeApi(a2b: AtoBRuntimeApi, b2c: BtoCRuntimeApi)
;
并将新的复合阶段定义为stageAtoB.viaMat(stageBtoC)(combineIntoAtoC)
combineIntoAtoC: (Future[AtoBRuntimeApi], Future[B2CRuntimeApi]) => Future[AtoCRuntimeApi]
。
显然,combineIntoAtoC
的实施需要ExecutionContext
的一些实例才能映射未来。
问题:在描述的案例中我应该使用哪种执行上下文?
选项,我宁愿避免:
在当前可用的实例中烘焙(当阶段组成时) - 如果执行上下文不可用,则“蓝图”将无法安全实现;
ExecutionContext.global
- 嗯,这是全球性的。使用它似乎非常错误(可能,每次实现一次 - 并不是那么重要)。
最需要的执行上下文是作为materializer(mat.executionContext
)的属性可用的上下文。但我无法在该组合功能中访问它。
答案 0 :(得分:2)
我通常在这种情况下使用actor系统上下文,默认情况下可以从materializer中引用。但是,作为一般解决方案,您可以使用隐式参数将执行上下文传递给构造流图的任何函数:
def makeGraph(...)(implicit ec: ExecutionContext): RunnableGraph = {
def combineIntoAtoC(...) = ... // uses ec implicitly
}
这使您可以决定使用哪个上下文来使用调用堆栈。在适当的级别,肯定会有一些访问演员系统的调度员。
我更喜欢使用actor系统的调度程序而不是全局调度程序的原因是因为它减少了依赖关系的表面 - 在这种情况下,所有执行上下文都来自一个源,并且您知道如何配置它们如果需要的话。