Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Akka流从外部世界获取无限流的当前值_Akka_Akka Stream - Fatal编程技术网

Akka流从外部世界获取无限流的当前值

Akka流从外部世界获取无限流的当前值,akka,akka-stream,Akka,Akka Stream,获取无限流的当前值的最佳方法是什么?该流聚集了值,并且根据定义永远不会完成 Source.repeat(1) .scan(0)(_+_) .to(Sink.ignore) 我想从Akka HTTP查询当前计数器值。我应该使用动态流吗?broadcastHub然后从Akka http订阅GET请求时的无限流?一个解决方案是使用参与者来保持所需的状态接收器。actorRef将在接收器中包装现有的actor ref,例如 class Keeper extends Actor { var

获取无限流的当前值的最佳方法是什么?该流聚集了值,并且根据定义永远不会完成

Source.repeat(1)
  .scan(0)(_+_)
  .to(Sink.ignore)

我想从Akka HTTP查询当前计数器值。我应该使用动态流吗?broadcastHub然后从Akka http订阅GET请求时的无限流?

一个解决方案是使用参与者来保持所需的状态<代码>接收器。actorRef将在接收器中包装现有的actor ref,例如

class Keeper extends Actor {
  var i: Int = 0

  override def receive: Receive = {
    case n: Int ⇒ i = n
    case Keeper.Get ⇒ sender ! i
  }
}

object Keeper {
  case object Get
}

val actorRef = system.actorOf(Props(classOf[Keeper]))

val q = Source.repeat(1)
  .scan(0)(_+_)
  .runWith(Sink.actorRef(actorRef, PoisonPill))

val result = (actorRef ? Keeper.Get).mapTo[Int]
请注意,使用
Sink.actorRef
时不会保留背压。这可以通过使用
Sink.actorRefWithAck
来改进。有关这方面的更多信息,请参见。

一种可能性是使用

Imagina具有以下参与者来存储来自流的状态:

对象StremState{
案例对象确认
密封特征协议扩展了可串行化的产品
case对象流初始化扩展协议
案例对象流扩展协议
最终案例类WriteState[A](值:A)扩展了协议
最终案例类StreamFailure(ex:Throwable)扩展了协议
最后一个案例对象GetState扩展了协议
}
类StremState[A](隐式A:ClassTag[A])使用ActorLogging扩展了Actor{
导入StremState_
变量状态:选项[A]=无
def接收:接收={
案例流初始化=>
log.info(“流已初始化!”)
sender()!Ack//Ack允许流继续发送更多元素
案例完成=>
log.info(“流已完成!”)
案例失败(ex)=>
log.error(例如,“流失败!”)
案例资产(A(价值))=>
info(“接收到的元素:{}”,值)
状态=某些(值)
sender()!Ack//Ack允许流继续发送更多元素
案例GetState=>
info(“获取状态:{}”,状态)
发件人()!状态
案例其他=>
警告(“意外消息“{}”,其他)
}
}
然后,可以在流的接收器中使用此actor,如下所示:

implicit val tm:Timeout=Timeout(1.秒)
val流:源[Int,NotUsed]=Source.repeat(1).扫描(0)(uu+u)
val receiver=system.actorOf(Props(新StremState[Int]))
val sink=sink.ActorRefWith背压(
接受者
onInitMessage=StremState.StreamInitialized,
ackMessage=StremState.Ack,
onCompleteMessage=StremState.StreamCompleted,
onFailureMessage=(ex:Throwable)=>StremState.StreamFailure(ex)
)
stream.runWith(sink)
//向接收方参与者请求流当前状态
val futureState=接收器?GetState

并行性和向参与者发送无序消息是否存在任何问题?上述示例中没有涉及并行性。您按顺序向参与者发送消息,参与者按顺序处理消息。Akka保证按照每个发件人对消息进行排序。