Question

I'm trying to create a multi-module application and run one of it's modules separately from the others (from another machine). Project structure looks like this:

        main
       /   \

 module1   module2

I want to run a module1 as a separate jar file (or there is a better way of doing this?), which I will run from another machine (I want to connect it to the main app using Akka remoting).

What I'm doing:

  1. Running "play dist" command
  2. Unzipping module1.zip from universal folder
  3. Setting +x mode to bin/module1 executable.
  4. Setting my main class (will paste it below): instead of play.core.server.NettyServer im putting my main class: declare -r app_mainclass="module1.foo.Launcher"
  5. Running with external application.conf file.

Here is my main class:

class LauncherActor extends Actor {
  def receive = {
    case a => println(s"Received msg: $a ")
  }
}

object Launcher extends App {
  val system = ActorSystem("testsystem")
  val listener = system.actorOf(Props[LauncherActor], name = "listener")
  println(listener.path)
  listener ! "hi!"
  println("Server ready")
}

Here is the console output:

@pavel bin$ ./module1 -Dconfig.file=/Users/pavel/projects/foobar/conf/application.conf
[WARN] [10/18/2013 18:56:03.036] [main] [EventStream(akka://testsystem)] [akka.event-handlers] config is deprecated, use [akka.loggers]
akka://testsystem/user/listener
Server ready
Received msg: hi!
@pavel bin$

So the system switches off as soon as it gets to the last line of the main method. If I run this code without Play - it works as expected, the object is loaded and it waits for messages, which is expected behavior.

Maybe I'm doing something wrong? Or should I set some options in module1 executable? Other ideas?

Thanks in advance!

Update: Versions:

  • Scala - 2.10.3
  • Play! - 2.2.0
  • SBT - 0.13.0
  • Akka - 2.2.1
  • Java 1.7 and 1.6 (tried both)

Build properties:

lazy val projectSettings = buildSettings ++ play.Project.playScalaSettings ++ Seq(resolvers := buildResolvers,
    libraryDependencies ++= dependencies) ++ Seq(scalacOptions += "-language:postfixOps",
    javaOptions in run ++= Seq(
      "-XX:MaxPermSize=1024m",
      "-Xmx4048m"
    ),
    Keys.fork in run := true)

  lazy val common = play.Project("common", buildVersion, dependencies, path = file("modules/common"))

  lazy val root = play.Project(appName, buildVersion, settings = projectSettings).settings(
    resolvers ++= buildResolvers
  ).dependsOn(common, module1, module2).aggregate(common, module1, module2)

  lazy val module1 = play.Project("module1", buildVersion, path = file("modules/module1")).dependsOn(common).aggregate(common)
  lazy val module2: Project = play.Project("module2", buildVersion, path = file("modules/module2")).dependsOn(common).aggregate(common)
Was it helpful?

Solution

So I found a dirty workaround and I will use it until I will find a better solution. In case someone is interested, I've added this code at the bottom of the Server object:

val shutdown = Future {
    readLine("Press 'ENTER' key to shutdown")
  }.map { q => 
      println("**** Shutting down ****")
      System.exit(0)
  }
  import scala.concurrent.duration._
  Await.result(shutdown, 100 days)

And now system works until I will hit the ENTER key in the console. Dirty, I agree, but didn't find a better solution.

If there will be something better, of course I will mark it as an answer.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top