7

在我們的項目中,我們有一個Flink(1.1.3)流作業,它從一個kafka隊列讀取數據,執行映射函數轉換並寫入另一個隊列。Flink和Play之間的Akka版本衝突2.5

直到我們將流出的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) 

調查到的話,我認爲這是阿卡2.3.x版本(由弗林克1.1.X帶來的)和阿卡的2.4.x(由PlayFramework帶來的)之間的衝突。

我們將Flink集羣升級到1.3.1(以及我們的代碼對Flink的依賴),假設這將解決問題。但同樣的問題似乎仍然存在。

任何想法仍然可能導致這一點?

+0

Flink 1.3.1仍然使用Akka 2.3(技術上定製的2.3版本叫做flakka)。 –

+0

@ChesnaySchepler考慮到Flink 1.3.1使用它自己的定製版本的akka​​(flaka)爲什麼會在Play遊戲中碰撞,在clathpath中尋找akka? – JoefGoldstein

+0

只是爲了更新。 我已經跑過了what'pepeOn「com.typesafe.akka」「akka-actor_2.11」「2.3.7」' 並且它沒有產生任何結果。 – JoefGoldstein

回答

1

解決此依賴性衝突的唯一方法是relocating the conflicting classes into a different namespace

+0

考慮到相互衝突的類在akka-actor中,這是Play的依賴關係,我還需要對play框架以及依賴它的所有「常見」庫進行影子化。 這將有非常嚴重的級聯效應。這是唯一的選擇嗎? – JoefGoldstein

+0

另外,正如我在我原來的問題的評論中提到的那樣,Flink 1.3.1在技術上影響了akka(通過使用「flakka」代替),所以它本身應該解決問題,儘管它沒有。 – JoefGoldstein

+0

關於這個問題的任何更新? – victtim