【发布时间】:2023-02-06 00:27:44
【问题描述】:
我有一个关于 Akka Streams 的一般性问题,
我需要根据 akka 之外的变量更改流行为。该变量是静态的,会被其他代码更改。
你将如何实现这一目标。只需检查流元素中的变量? 例如:
.filterNot(ping -> pingRecieved)
pingRecieved 是 Java 类中的静态变量。
【问题讨论】:
标签: java akka-stream
我有一个关于 Akka Streams 的一般性问题,
我需要根据 akka 之外的变量更改流行为。该变量是静态的,会被其他代码更改。
你将如何实现这一目标。只需检查流元素中的变量? 例如:
.filterNot(ping -> pingRecieved)
pingRecieved 是 Java 类中的静态变量。
【问题讨论】:
标签: java akka-stream
让流阶段检查某些全局状态并根据该状态更改其行为是合法的。
这是否是个好主意完全是另一个问题。
至少,您需要了解 Java 内存模型在可见性方面的限制和微妙之处(因为如果写入该变量的代码不在与流阶段相同的线程上执行(并且如果它在 Akka 之外) ,它绝对不会;如果它是由演员在与流阶段相同的调度程序上执行的代码,它可能在某个时候在同一线程上执行,但控制它需要一些权衡),无法保证何时(甚至可能无论) 流阶段将看到写入)。确保可见性(例如 volatile 或使用原子)可能反过来对性能等产生重大影响。
您可能想要研究替代方案,例如自定义流阶段,它具体化为一个对象,该对象具有将对该值的更新传播到阶段的方法(例如,通过 Akka 中的异步回调机制):这些将保证对阶段可见并且将抽象出并发性。另一种选择是公开一个源(例如Source.queue),它将对该值的更改作为流元素注入,这些元素被合并到流中并由流解释以改变其行为。或者,在某些情况下,使用 mapAsync 或 ask 将流元素传递给 actor 可能很有用。
【讨论】: