Akka Stream OnNext是不允许的

Akka Stream OnNext是不允许的,akka,apache-kafka,reactive-programming,akka-stream,Akka,Apache Kafka,Reactive Programming,Akka Stream,我只是遵循了akka stream ActorPublisher的示例,有时我会收到以下消息: java.lang.IllegalStateException:当流 尚未请求元素,totalDemand为0 看看这些文件,他们解释说: 通过调用onNext将元素发送到流。你可以 发送流订阅者请求的尽可能多的元素。 此金额可通过totalDemand查询。它只允许 当isActive和totalDemand>0时使用onNext,否则onNext将 抛出非法状态异常 当流订阅者请求更多元素时 Ac

我只是遵循了akka stream ActorPublisher的示例,有时我会收到以下消息:

java.lang.IllegalStateException:当流 尚未请求元素,totalDemand为0

看看这些文件,他们解释说:

通过调用onNext将元素发送到流。你可以 发送流订阅者请求的尽可能多的元素。 此金额可通过totalDemand查询。它只允许 当isActive和totalDemand>0时使用onNext,否则onNext将 抛出非法状态异常

当流订阅者请求更多元素时 ActorPublisherMessage.Request消息已传递到此参与者,并且 你可以对那件事采取行动。总需求将自动更新

如何防止总需求为零?当我收到这个错误时,我丢失了我试图发送的消息

以下是我一直遵循的示例:

这是我的班级考试

object Test extends App {

  implicit val actorSystem = ActorSystem("ReactiveKafka")
  implicit val materializer = ActorFlowMaterializer()

  val kafka = new ReactiveKafka(host = "localhost:9092", zooKeeperHost = "localhost:2181")
  val publisher = kafka.consume("test", "groupName", new StringDecoder())

  val workerActor = actorSystem.actorOf(Props[Worker], name = "workerActor")

  Source(publisher).map(WorkerPool.Msg(_, workerActor)).runWith(Sink.actorSubscriber(WorkerPool.props))

}
好吧,我收到了卡夫卡的消息,我正在传递给WorkerActor,但是当每秒向卡夫卡发送10条消息时,由于这个错误,其中一些消息丢失了

更新

我遇到了这里描述的错误(使用相同的库):

我用一个缓冲区解决了我的问题,但看起来这个PR可以解决这个问题


如果下游水槽没有任何需求,那么您唯一的选择就是

  • 告诉数据源馈送
    工作人员
    没有需求,以便源可以停止生成消息,直到有更多需求出现(反应式解决方案)
  • 缓冲邮件,直到您从接收器收到一些可能会填满您的缓冲区的请求,然后您仍然会丢弃邮件
  • 当需求为0时删除消息(这似乎是您当前的实现) 但“背压”的全部目的是防止在没有需求时调用onNext

    要实现上述选项,您可以在参与者内部或外部设置缓冲区:

    • 内部缓冲区:查看中的“ActorPublisher”示例,以了解为ActorPublisher提供数据的Actor中的缓冲示例
    • 外部缓冲区:使用缓冲物化器或流中的外部缓冲区

    implicit val materializer=ActorFlowMaterializer(ActorFlowMaterializerSettings(actorSystem).withInputBuffer(initialSize=1024,maxSize=1024))实现上述代码对我来说很有用。谢谢你,很高兴听到你这么说。我记得在使用外部缓冲区时有一些注意事项,而不是将缓冲区保留在Actor本身中。请注意…在我的ActorSubscriber中,我有一个MaxQueueSize=100,但没有一个带缓冲区的隐式物化器,它会不断地删除我的消息。如何实现演员缓冲区?请看我在回答中给出的链接: