この記事の結論 globalなExecutionContextではブロックする処理をblockingで包むとスレッド数が勝手に増えるから空きスレッドが無くて実行できないといったことを防げる。 ExecutionContext.fromExecutorService(new ForkJoinPool(100)) で生成されるThreadはBlockContextトレイトを継承してないのでblockingを使ってもスレッド数を増やした方が良いという情報がスケジューラに伝わらない。 akkaのdispatcherをExecutionContextとして使うとBlockContext付きのForkJoinPoolを簡単に作れる。 ExecutionContext.fromExecutorServiceでもForkJoinPoolのコンストラクタに自前定義したThreadFactoryを渡すようにす