Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combining Akka, Spray, and embedded Jetty

Tags:

scala

akka

jetty

I'm trying to create a standalone JAR containing Akka, Spray, and Jetty. Ideally I distribute the entire application in that single file, without any external files whatsoever.

I understand how to create an embedded Jetty server instance

def main(args: Array[String]): Unit = {
    val server = new Server(9012);
    server.start();
    server.join();
    Thread.sleep(2000);
    server.stop();
}

and I've followed the Spray example code in creating a HelloService and Boot class, but I have no earthly idea of how to connect the two, so that when a URL is requested on the Jetty server a Spray service responds to it. Any help would be much appreciated.

Update: I'm getting a lot closer to solving this problem, thanks to a thread of inquiry prompted by Alois Cochard (I'm coming from a web scripting background, and getting my head around Java web services has been ... challenging!). I've modified my main method to start the server and read the Jetty and akka configuration files that are in the getting started template. It's reading both of those files, but now I'm getting this when I navigate to / on the Jetty server:

HTTP ERROR: 500

Problem accessing /. Reason:

assertion failed: 0 actors for id 'spray-root-service' found, expected exactly one

I know I'm missing something silly (and probably that I should break down and use SBT, but being able to just compile and run in Eclipse, and then refresh in the browser, is so simple and appealing).

Update #2: Figured out the problem. I wasn't creating a WebAppContext object, which meant that the web.xml was never getting read, and thus Akka was never being loaded. This is the revised main method which is now working.

like image 451
John Biesnecker Avatar asked Aug 17 '11 08:08

John Biesnecker


1 Answers

According to the spray-template, you should add the Spray servlet connector in the web.xml configuration file:

http://github.com/spray/spray-template/blob/master/src/main/webapp/WEB-INF/web.xml

You can find some informations about how to configure a standealone jetty to use this file here (there is surely better references in netty documentation directly):

http://exist.sourceforge.net/deployment.html#d47e594

BTW, using the spray template as a basis for your project looks like a good idea ;)

like image 51
Alois Cochard Avatar answered Nov 04 '22 14:11

Alois Cochard