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保证按照每个发件人对消息进行排序。