【问题标题】:can this code can be translated to stateful akka streams?这段代码可以翻译成有状态的akka​​流吗?
【发布时间】:2017-09-14 20:22:18
【问题描述】:

我正在尝试使用 akka 流来收听 sqs,我从它的 q 中获取消息 使用这个代码sn-p:

当然,这段代码 sn-p 一个接一个地获取消息(然后确认它):

implicit val system = ActorSystem()
implicit val mat = ActorMaterializer()
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(ioThreadPoolSize))
val awsSqsClient: AmazonSQSAsync = AmazonSQSAsyncClientBuilder
  .standard()
  .withCredentials(new ClasspathPropertiesFileCredentialsProvider())
  .withEndpointConfiguration(new EndpointConfiguration(sqsEndpoint, configuration.regionName))
  .build()

val future = SqsSource(sqsEndpoint)(awsSqsClient)
  .takeWhile(_ => true)
  .mapAsync(parallelism = 2)(m => {
    val msgBody = SqsMessage.deserializeJson(m.getBody)
    msgBody match {
      case Right(body) => val id = getId(body) //do some stuff with the message may save state according the id
    }
    Future(m, Ack())
  })
  .to(SqsAckSink(sqsEndpoint)(awsSqsClient))
  .run()

我的问题是: 我可以获取多条消息,并将它们保存在一个有状态的地图中以供以后使用吗?

例如收到 5 条消息后(所有消息都将保存(每个状态))

如果发生特定情况,我将全部确认,如果没有,它们将返回队列(因为可见性超时,无论如何都会发生)?

谢谢。

【问题讨论】:

    标签: akka amazon-sqs akka-stream


    【解决方案1】:

    可能是您正在寻找grouped(或groupedWithin)组合子。这些允许您批量处理消息并分组处理它们。 groupedWithin 允许您在某个时间后释放一批,以防它尚未达到您确定的大小。文档参考here

    在随后的检查流程中,您可以执行所需的任何逻辑,并在您希望消息被确认时发出序列,否则不发出它们。

    例子:

      val yourCheck: Flow[Seq[MessageActionPair], Seq[MessageActionPair], NotUsed] = ???
    
      val future = SqsSource(sqsEndpoint)(awsSqsClient)
        .takeWhile(_ => true)
        .mapAsync(parallelism = 2){ ... }
        .grouped(5)
        .via(yourCheck)
        .mapConcat(identity)
        .to(SqsAckSink(sqsEndpoint)(awsSqsClient))
        .run()
    

    【讨论】:

    • 我得到错误:(115, 18) 类型不匹配;找到: Seq[(com.amazonaws.services.sqs.model.Message, akka.stream.alpakka.sqs.MessageAction)] => Seq[(com.amazonaws.services.sqs.model.Message, akka.stream.alpakka .sqs.MessageAction)] 需要:Seq[(com.amazonaws.services.sqs.model.Message, akka.stream.alpakka.sqs.MessageAction)] => scala.collection.immutable.Iterable[?] .mapConcat(identity )
    • 确保导入immutable.Seq。类型系统与不可变的 Seq 混淆了
    • 我设置了 val yourCheck: Flow[scala.collection.immutable.Seq[MessageActionPair], scala.collection.immutable.Seq[MessageActionPair], NotUsed] = ???但我得到 :Error:(115, 12) 前向引用扩展了值 yourCheck .via(yourCheck) 的定义
    • 嗨,Stefano,您能详细说明一下吗?
    • 请用失败的代码修改你的问题,否则我将无法重现这个..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多