【问题标题】:akka stream behaviour based on outside variable基于外部变量的 akka 流行为
【发布时间】:2023-02-06 00:27:44
【问题描述】:

我有一个关于 Akka Streams 的一般性问题,

我需要根据 akka 之外的变量更改流行为。该变量是静态的,会被其他代码更改。

你将如何实现这一目标。只需检查流元素中的变量? 例如:

     .filterNot(ping -> pingRecieved)

pingRecieved 是 Java 类中的静态变量。

【问题讨论】:

    标签: java akka-stream


    【解决方案1】:

    让流阶段检查某些全局状态并根据该状态更改其行为是合法的。

    这是否是个好主意完全是另一个问题。

    至少,您需要了解 Java 内存模型在可见性方面的限制和微妙之处(因为如果写入该变量的代码不在与流阶段相同的线程上执行(并且如果它在 Akka 之外) ,它绝对不会;如果它是由演员在与流阶段相同的调度程序上执行的代码,它可能在某个时候在同一线程上执行,但控制它需要一些权衡),无法保证何时(甚至可能无论) 流阶段将看到写入)。确保可见性(例如 volatile 或使用原子)可能反过来对性能等产生重大影响。

    您可能想要研究替代方案,例如自定义流阶段,它具体化为一个对象,该对象具有将对该值的更新传播到阶段的方法(例如,通过 Akka 中的异步回调机制):这些将保证对阶段可见并且将抽象出并发性。另一种选择是公开一个源(例如Source.queue),它将对该值的更改作为流元素注入,这些元素被合并到流中并由流解释以改变其行为。或者,在某些情况下,使用 mapAsyncask 将流元素传递给 actor 可能很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多