Flink和Play 2.5之间的Akka版本冲突

7
在我们的项目中,有一个 Flink (1.1.3) 流处理作业,它从一个 Kafka 队列读取数据,进行映射函数转换并写入另一个队列。但是在我们引入流程的一部分输出 REST 请求之后,发现出现了问题。为了解决这个问题,我们使用了 PlayFramework 的 WSClient (因为在我们的堆栈的其他地方也使用了它),并以以下方式在代码中创建了它:
  val config = new AhcWSClientConfig(wsClientConfig = WSClientConfig())
  val builder = new AhcConfigBuilder(config)
  val ahcConfig = builder.configure().build()
  new AhcWSClient(ahcConfig)(ActorMaterializer()(ActorSystem()))

这在本地工作得很好,但是当我部署它并在群集上运行时,我遇到了这个异常:
java.lang.NoSuchMethodError: akka.util.Helpers$.toRootLowerCase(Ljava/lang/String;)Ljava/lang/String;
    at akka.stream.StreamSubscriptionTimeoutSettings$.apply(ActorMaterializer.scala:491)
    at akka.stream.ActorMaterializerSettings$.apply(ActorMaterializer.scala:243)
    at akka.stream.ActorMaterializerSettings$.apply(ActorMaterializer.scala:232)
    at akka.stream.ActorMaterializer$$anonfun$1.apply(ActorMaterializer.scala:41)
    at akka.stream.ActorMaterializer$$anonfun$1.apply(ActorMaterializer.scala:41)
    at scala.Option.getOrElse(Option.scala:121)
    at akka.stream.ActorMaterializer$.apply(ActorMaterializer.scala:41)
    at com.ourstuff.etl.core.utils.web.GlobalWSClient$.generateClient(WSClientFactory.scala:32)

经过调查,我认为这是Akka 2.3.x(由Flink 1.1.X带来)与Akka 2.4.x(由PlayFramework带来)之间的冲突。

我们升级了Flink集群到1.3.1(以及我们代码中的Flink依赖),希望这可以解决问题。但是似乎问题仍然存在。

您有什么想法,仍然可能导致这种情况发生吗?


Flink 1.3.1仍然使用Akka 2.3(技术上来说是一个名为flakka的自定义2.3版本构建)。 - Chesnay Schepler
1
@ChesnaySchepler 考虑到 Flink 1.3.1 使用其自己定制的 akka 版本 (flaka),为什么 Play 在 classpath 中查找 akka 时会发生冲突? - JoefGoldstein
只是在此基础上更新一下。 我已经在sbt上运行了以下命令: whatDependsOn "com.typesafe.akka" "akka-actor_2.11" "2.3.7"但没有得到任何结果。 - JoefGoldstein
1
碰撞仍然发生,因为flakka只是akka的重新打包,带有一些后移的补丁。具体来说,所有类的包都是相同的,这是类加载器关心的唯一事情。 - Chesnay Schepler
1个回答

1

考虑到冲突的类位于 Play 的依赖项 akka-actor 中,我需要同时遮蔽 Play 框架以及所有依赖于它的“通用”库。这将产生非常严重的级联效应。这是唯一的选择吗? - JoefGoldstein
同样,正如我在原问题的评论中提到的那样,Flink 1.3.1 在技术上使用“flakka”来替代akka(即使用“flakka”代替akka),因此这本身应该可以解决问题,但实际上并没有。 - JoefGoldstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接