当前位置: 首页 > 知识库问答 >
问题:

如何在失败的情况下使用多个期货

云韬
2023-03-14

我有一个有两条消息的参与者,第一个负责在mongoDB中插入数据,第二个参与者负责在elasticsearch、InserInMongo和Inserins中插入数据。也就是说,当mongoDB插入操作失败或ES插入操作因某些异常而失败时,会出现这种情况,我正在做类似的事情

try {
        val mongoFuture: Future[Boolean] = ask(artGroupPersistenceActor, PersistArtGroupInMongo(artGroup)).mapTo[Boolean]
        val esFuture: Future[Boolean] = ask(artGroupPersistenceActor, PersistArtGroupInES(artGroup)).mapTo[Boolean]
        val resultMongo = Await.result(mongoFuture, timeout.duration)
        log.debug("store: Record Inserted inserted in mongoDB  {}", resultMongo)
        val resultES = Await.result(esFuture, timeout.duration)
        log.debug("store: Record Inserted in ES  {}", resultES)
}
catch {
        case e: Exception =>
          log.error("store:While inserting an artgroup Exception in artGroupPersistenceActor  actor", e)
          throw e
      }

在这里,我想如果mongoFuture失败,那么我抓住它的异常,它应该继续与esFuture

或者如果两个未来都失败了,我得到了两个例外,我如何存档这个场景?

共有3个答案

齐奕
2023-03-14

如果您只想记录异常,只需对每个异常执行以下操作:

mongoFuture.failed.foreach {ex => logger.error("Mongo error", ex)}
丰誉
2023-03-14

您可以使用recovery,它将处理原始Future包含的任何匹配的可抛出物:

    val mongoFuture = ask(artGroupPersistenceActor, PersistArtGroupInMongo(artGroup))
        .mapTo[Boolean]
        .recover {
          case e =>
            println("error in mongo: " + e)
            false
        }

      val esFuture = ask(artGroupPersistenceActor, PersistArtGroupInES(artGroup))
        .mapTo[Boolean]
        .recover {
          case e =>
            println("error in ES: " + e)
            false
        }

      val f = Future.sequence(List(mongoFuture, esFuture))
      val result: Seq[Boolean] = Await.result(f, Duration.Inf)

      println(result)
舒飞捷
2023-03-14

你可以这样试试。

    for {
        x <- Future.successful {
            try {
                code here...
            } catch {
                case _: Exception => 
                    println("Error Inserting In Mongo ")
                    false
            }
        }
        y <- Future.successful {
            try {
                code here...
                    // throw new IllegalStateException("Exception thrown")
            } catch {
                case _: IllegalStateException => 
                    println("Error Inserting In ES ")
                    false
            }
        }

    } yield(x, y)

现在,如果在执行过程中发生错误,您可以进行操作..祝您好运。

 类似资料:
  • 我在一个Spray应用程序中使用ask模式调用一个Actor,并将结果作为HTTP响应返回。我将故障从参与者映射到自定义错误代码。 当authActor发送一个失败时,这可以正常工作,但是如果authActor抛出一个异常,则在请求超时完成之前什么也不会发生。例如: 这样,如果它是预期的错误(即ServiceException),则通过创建一个失败来处理它。如果它是意外的,它会立即返回一个失败,以

  • 网上有不少关于这个错误的帖子。我的情况是,我有时可以建立连接,但大多数时候失败了。以下是失败时的错误: 以下是成功时的信息: 我没有很好的解释,为什么有时它能工作,而另一次却不能。在每次之前,Mate 9上启用了

  • 上下文:我想编译和测试一个多模块项目中的所有模块,但如果任何一个失败,编译或测试,我希望整个构建失败。 默认配置要么在第一次失败时停止,要么在测试失败后跳过模块 跑步: 在第一个失败的模块处停止。 如果添加: mvn clean Install-FAE//结束时失败 null 响应非常感谢-否则,如果有多个问题,我们必须在构建服务器上重复运行测试-消耗大量时间。

  • 2.2.显示日历后,程序必须询问用户是否要输入另一个日期(是否继续?) 2.3.用户必须用大小写字母的任意组合回答是、否、y或n 2.4.如果给出了无效的答案,则必须通知用户该答案不可接受,然后再次提示用户输入另一个答案。如果给出了三个以上连续的错误答案,程序必须以适当的错误消息终止 这是我目前所拥有的 如果年份是错误的,它会打印无效年份,但现在m坚持如何在结束程序之前再次询问3个领带/如果用户在

  • 我正在调查 Postgres 数据库上经常执行的查询,以帮助减少 XID 的使用。我可以获取执行的查询列表以及使用调用次数,但它不包括由于唯一约束违规等原因而失败的查询。有没有办法记录并获取这些失败查询的计数? 例: 如图所示,如果INSERT查询总是失败,并且如果成功执行后查询已经存在,则调用计数不会因后续失败的查询而增加,即使失败的查询导致当前XID增加。

  • 例如。 当我将类A作为Testng类执行时,得到以下输出 而期望的输出是