Skip to content

Commit

Permalink
support for compile time DI (MacWire), #1
Browse files Browse the repository at this point in the history
* for scaladsl-persistence and scaladsl-persistence-jdbc
* factory for PersistentEntity registration
* factory for ReadSide registration
* components trait for compile time DI
* separate traits for write and read side
* split up cluster module
* remove guice
  • Loading branch information
patriknw committed Oct 27, 2016
1 parent f52b26e commit 6e986ea
Show file tree
Hide file tree
Showing 40 changed files with 403 additions and 339 deletions.
46 changes: 37 additions & 9 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,9 @@ val coreProjects = Seq[ProjectReference](
jackson,
`play-json`,
core,
cluster,
`cluster-core`,
`cluster-javadsl`,
`cluster-scaladsl`,
pubsub,
`kafka-client`,
`kafka-broker`,
Expand Down Expand Up @@ -447,15 +449,27 @@ def singleTestsGrouping(tests: Seq[TestDefinition]) = {
}
}

lazy val cluster = (project in file("cluster"))
lazy val `cluster-core` = (project in file("cluster/core"))
.settings(name := "lagom-cluster-core")
.settings(runtimeLibCommon: _*)
.enablePlugins(RuntimeLibPlugins)
.settings(
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-cluster" % AkkaVersion,
"com.typesafe.akka" %% "akka-testkit" % AkkaVersion % "test",
scalaTest % Test,
"com.novocode" % "junit-interface" % "0.11" % "test"
)
)

lazy val `cluster-javadsl` = (project in file("cluster/javadsl"))
.settings(name := "lagom-javadsl-cluster")
.dependsOn(`api-javadsl`, jackson)
.dependsOn(`cluster-core`, jackson)
.settings(runtimeLibCommon: _*)
.settings(multiJvmTestSettings: _*)
.enablePlugins(RuntimeLibPlugins)
.settings(
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-cluster" % AkkaVersion,
"com.typesafe.akka" %% "akka-testkit" % AkkaVersion % "test",
"com.typesafe.akka" %% "akka-multi-node-testkit" % AkkaVersion % "test",
scalaJava8Compat,
Expand All @@ -465,9 +479,24 @@ lazy val cluster = (project in file("cluster"))
)
) configs (MultiJvm)

lazy val `cluster-scaladsl` = (project in file("cluster/scaladsl"))
.settings(name := "lagom-scaladsl-cluster")
.dependsOn(`cluster-core`, `play-json`)
.settings(runtimeLibCommon: _*)
.settings(multiJvmTestSettings: _*)
.enablePlugins(RuntimeLibPlugins)
.settings(
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-testkit" % AkkaVersion % "test",
"com.typesafe.akka" %% "akka-multi-node-testkit" % AkkaVersion % "test",
scalaTest % Test,
"com.novocode" % "junit-interface" % "0.11" % "test"
)
) configs (MultiJvm)

lazy val pubsub = (project in file("pubsub"))
.settings(name := "lagom-javadsl-pubsub")
.dependsOn(cluster)
.dependsOn(`cluster-javadsl`)
.settings(runtimeLibCommon: _*)
.settings(multiJvmTestSettings: _*)
.enablePlugins(RuntimeLibPlugins)
Expand All @@ -486,13 +515,12 @@ lazy val pubsub = (project in file("pubsub"))

lazy val `persistence-core` = (project in file("persistence/core"))
.settings(name := "lagom-persistence-core")
.dependsOn(cluster)
.dependsOn(`cluster-core`, `api-javadsl`) // FIXME replace api-javadsl dependency, ServiceLocatorHolder
.settings(runtimeLibCommon: _*)
.settings(Protobuf.settings)
.enablePlugins(RuntimeLibPlugins)
.settings(
libraryDependencies ++= Seq(
"com.google.inject" % "guice" % "4.0",
scalaJava8Compat,
"com.typesafe.akka" %% "akka-persistence" % AkkaVersion,
"com.typesafe.akka" %% "akka-persistence-query-experimental" % AkkaVersion,
Expand All @@ -507,14 +535,14 @@ lazy val `persistence-core` = (project in file("persistence/core"))

lazy val `persistence-javadsl` = (project in file("persistence/javadsl"))
.settings(name := "lagom-javadsl-persistence")
.dependsOn(`persistence-core` % "compile;test->test")
.dependsOn(`persistence-core` % "compile;test->test", jackson, `cluster-javadsl`)
.settings(runtimeLibCommon: _*)
.settings(Protobuf.settings)
.enablePlugins(RuntimeLibPlugins)

lazy val `persistence-scaladsl` = (project in file("persistence/scaladsl"))
.settings(name := "lagom-scaladsl-persistence")
.dependsOn(`persistence-core` % "compile;test->test", `play-json` % "test")
.dependsOn(`persistence-core` % "compile;test->test", `play-json`, `cluster-scaladsl`)
.settings(runtimeLibCommon: _*)
.settings(Protobuf.settings)
.enablePlugins(RuntimeLibPlugins)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
play.modules.enabled += com.lightbend.lagom.internal.cluster.JoinClusterModule

lagom.cluster {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright (C) 2016 Lightbend Inc. <http://www.lightbend.com>
*/
package com.lightbend.lagom.internal.cluster

import java.util.concurrent.TimeUnit

import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.Try

import akka.actor.ActorSystem
import akka.cluster.Cluster

private[lagom] object JoinClusterImpl {

def join(system: ActorSystem): Unit = {

val config = system.settings.config
def joinSelf = config.getBoolean("lagom.cluster.join-self")
def terminateSystemAfter = config.getDuration(
"lagom.cluster.terminate-system-after-member-removed", TimeUnit.MILLISECONDS
).millis
def exitJvm = config.getBoolean("lagom.cluster.exit-jvm-when-system-terminated")

// join self if seed-nodes are not configured in dev-mode,
// otherwise it will join the seed-nodes automatically
val cluster = Cluster(system)
if (cluster.settings.SeedNodes.isEmpty && joinSelf)
cluster.join(cluster.selfAddress)

if (exitJvm) {
// exit JVM when ActorSystem has been terminated
system.registerOnTermination(System.exit(0))
}

Cluster(system).registerOnMemberRemoved {
// The delay is to give ClusterSingleton actors some time to stop gracefully.
system.scheduler.scheduleOnce(terminateSystemAfter) {
system.terminate()

if (exitJvm) {
// In case ActorSystem shutdown takes longer than 10 seconds,
// exit the JVM forcefully anyway.
// We must spawn a separate thread to not block current thread,
// since that would have blocked the shutdown of the ActorSystem.
val t = new Thread(new Runnable {
override def run(): Unit = {
if (Try(Await.ready(system.whenTerminated, 10.seconds)).isFailure)
System.exit(-1)
}
})
t.setDaemon(true)
t.start()
}
}(system.dispatcher)

}
}

}

1 change: 1 addition & 0 deletions cluster/javadsl/src/main/resources/reference.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
play.modules.enabled += com.lightbend.lagom.internal.javadsl.cluster.JoinClusterModule
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright (C) 2016 Lightbend Inc. <http://www.lightbend.com>
*/
package com.lightbend.lagom.internal.javadsl.cluster

import scala.concurrent.duration._

import akka.actor.ActorSystem
import com.google.inject.AbstractModule
import com.google.inject.Inject
import com.lightbend.lagom.internal.cluster.JoinClusterImpl

class JoinClusterModule extends AbstractModule {
override def configure(): Unit = {
binder.bind(classOf[JoinCluster]).asEagerSingleton()
}
}

private[lagom] class JoinCluster @Inject() (system: ActorSystem) {
JoinClusterImpl.join(system)
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* Copyright (C) 2016 Lightbend Inc. <http://www.lightbend.com>
*/
package com.lightbend.lagom.scaladsl.cluster

import scala.concurrent.ExecutionContext

import akka.actor.ActorSystem
import akka.cluster.Cluster
import com.lightbend.lagom.internal.cluster.JoinClusterImpl

/**
* Cluster components (for compile-time injection).
*/
trait ClusterComponents {
def actorSystem: ActorSystem

// eager initialization
val cluster: Cluster = {
JoinClusterImpl.join(actorSystem)
Cluster(actorSystem)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
package com.lightbend.lagom.internal.persistence.jdbc

import java.util.concurrent.TimeUnit
import javax.inject.{ Inject, Singleton }

import akka.Done
import akka.actor.ActorSystem
Expand All @@ -24,11 +23,9 @@ import scala.concurrent.{ ExecutionContext, Future }
import scala.concurrent.duration._
import scala.util.{ Failure, Success }

@Singleton
class SlickProvider @Inject() (
class SlickProvider(
system: ActorSystem,
dbApi: DBApi /* Ensures database is initialised before we start anything that needs it */
)(implicit ec: ExecutionContext) {
dbApi: DBApi /* Ensures database is initialised before we start anything that needs it */ )(implicit ec: ExecutionContext) {

private val logger = LoggerFactory.getLogger(this.getClass)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import javax.inject.{ Inject, Singleton }
import akka.Done
import akka.actor.ActorSystem
import com.lightbend.lagom.internal.javadsl.persistence.{ OffsetDao, OffsetStore, ReadSideConfig }
import com.lightbend.lagom.internal.persistence.jdbc.{ AbstractSlickOffsetStoreConfiguration, SlickOffsetStore, SlickProvider }
import com.lightbend.lagom.internal.persistence.jdbc.{ AbstractSlickOffsetStoreConfiguration, SlickOffsetStore }
import com.lightbend.lagom.javadsl.persistence.Offset
import play.api.Configuration

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import akka.persistence.query.PersistenceQuery
import akka.persistence.query.scaladsl.EventsByTagQuery
import com.google.inject.Injector
import com.lightbend.lagom.internal.javadsl.persistence.AbstractPersistentEntityRegistry
import com.lightbend.lagom.internal.persistence.jdbc.SlickProvider
import com.lightbend.lagom.javadsl.persistence.PersistentEntity

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import javax.inject.{ Inject, Singleton }
import akka.Done
import akka.japi.Pair
import akka.stream.javadsl.Flow
import com.lightbend.lagom.internal.persistence.jdbc.SlickProvider
import com.lightbend.lagom.javadsl.persistence.ReadSideProcessor.ReadSideHandler
import com.lightbend.lagom.javadsl.persistence.jdbc.JdbcReadSide
import com.lightbend.lagom.javadsl.persistence.jdbc.JdbcReadSide._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ package com.lightbend.lagom.internal.javadsl.persistence.jdbc
import java.util.concurrent.CompletionStage
import javax.inject.{ Inject, Singleton }

import com.lightbend.lagom.internal.persistence.jdbc.SlickProvider
import com.lightbend.lagom.javadsl.persistence.jdbc.JdbcSession
import com.lightbend.lagom.javadsl.persistence.jdbc.JdbcSession.ConnectionFunction

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright (C) 2016 Lightbend Inc. <http://www.lightbend.com>
*/
package com.lightbend.lagom.internal.javadsl.persistence.jdbc

import scala.concurrent.ExecutionContext
import scala.concurrent.duration._

import akka.actor.ActorSystem

import javax.inject.{ Inject, Singleton }
import play.api.db.DBApi
import slick.ast._

@Singleton
class SlickProvider @Inject() (
system: ActorSystem,
dbApi: DBApi /* Ensures database is initialised before we start anything that needs it */ )(implicit ec: ExecutionContext)
extends com.lightbend.lagom.internal.persistence.jdbc.SlickProvider(system, dbApi)(ec)
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.lightbend.lagom.javadsl.persistence.jdbc

import java.util.concurrent.CompletionStage

import com.lightbend.lagom.internal.persistence.jdbc.SlickProvider
import com.lightbend.lagom.internal.javadsl.persistence.jdbc.SlickProvider
import com.lightbend.lagom.javadsl.persistence.TestEntity.Evt
import com.lightbend.lagom.javadsl.persistence.ReadSideProcessor
import com.lightbend.lagom.javadsl.persistence.jdbc.testkit.TestUtil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
* Copyright (C) 2016 Lightbend Inc. <http://www.lightbend.com>
*/
package com.lightbend.lagom.javadsl.persistence.jdbc

import akka.actor.ActorSystem
import akka.cluster.Cluster
import com.lightbend.lagom.internal.javadsl.persistence.ReadSideConfig
import com.lightbend.lagom.internal.javadsl.persistence.jdbc.{ JdbcOffsetStore, JdbcReadSideImpl, JdbcSessionImpl, OffsetTableConfiguration }
import com.lightbend.lagom.internal.persistence.jdbc._
import com.lightbend.lagom.javadsl.persistence.jdbc.testkit.TestUtil
import com.lightbend.lagom.persistence.{ ActorSystemSpec, PersistenceSpec }
import com.typesafe.config.{ Config, ConfigFactory }
Expand All @@ -16,6 +16,7 @@ import play.api.db.{ Database, Databases }
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.Random
import com.lightbend.lagom.internal.javadsl.persistence.jdbc.SlickProvider

abstract class JdbcPersistenceSpec(_system: ActorSystem) extends ActorSystemSpec(_system) {

Expand Down

This file was deleted.

Loading

0 comments on commit 6e986ea

Please sign in to comment.