Wow, this is a really impressive body of work, arguably the most complete Scala framework outside of Lift (but much easier to use). Xitrum is truly a full stack web framework, all the bases are covered, including wtf-am-I-on-the-moon extras like ETags, static file cache identifiers & auto-gzip compression. Tack on built-in JSON converter, before/around/after interceptors, request/session/cookie/flash scopes, integrated validation (server & client-side, nice), built-in cache layer (Hazelcast), i18n a la GNU gettext, Netty (with Nginx, hello blazing fast), etc. and you have, wow.
There are comprehensive usage guides for many languages.
Простое масштабирование, за счет создания новых нод.
import xitrum.Action
import xitrum.annotation.GET
@GET("url/to/HelloAction")
class HelloAction extends Action {
def execute() {
val urlToHelloActor = url[HelloActor]
respondHtml(
<xml:group>
<p>Hello {remoteIp}!</p>
<a href={urlToHelloActor}>Actor example</a>
</xml:group>
)
}
}
Этот код будет выполнен в потоке Netty.
Для запуска в отдельном потоке (из пула),
наследуйтесь от xitrum.FutureAction
.
import scala.concurrent.duration._
import akka.actor.ReceiveTimeout
import xitrum.ActorAction
import xitrum.annotation.GET
@GET("url/to/HelloActor")
class HelloActor extends ActorAction {
def execute() {
log.info("Request received: " + request)
// Communicate with another actor
anotherActorRef ! "aMsg"
// Wait for the above actor to reply within 5s
context.setReceiveTimeout(5.seconds)
context.become {
case aReply =>
respondText(aReply)
case ReceiveTimeout =>
respondText("Timeout")
}
}
override def postStop() {
log.info("Connection closed or response sent")
super.postStop()
}
}
Используя аннотации вы сделаете акторов доступными из сети!
import xitrum.{
WebSocketAction,
WebSocketText, WebSocketBinary,
WebSocketPing, WebSocketPong
}
import xitrum.annotation.WEBSOCKET
@WEBSOCKET("url/to/EchoWebSocketActor")
class EchoWebSocketActor extends WebSocketAction {
def execute() {
log.info("WebSocket onopen")
context.become {
case WebSocketText(text) =>
respondWebSocketText(text)
case WebSocketBinary(bytes) =>
respondWebSocketBinary(bytes)
case WebSocketPing =>
// Xitrum automatically sends pong for you,
// you don't have to send pong yourself
case WebSocketPong =>
// Client has received your ping
}
}
override def postStop() {
log.info("WebSocket onclose")
super.postStop()
}
}
import xitrum.{SockJsAction, SockJsText}
import xitrum.annotation.SOCKJS
@SOCKJS("url/to/EchoSockJsActor")
class EchoSockJsActor extends SockJsAction {
def execute() {
log.info("SockJS onopen")
context.become {
case SockJsText(text) =>
respondSockJsText(text)
}
}
override def postStop() {
log.info("SockJS onclose")
super.postStop()
}
}
Смотри проект xitrum-new.
Скачайте xitrum-new.zip, распакуйте и выполните:
sbt/sbt run
Теперь у вас есть пустой проект работающий по адресу http://localhost:8000/ и https://localhost:4430/
Для генерации проекта Eclipse:
sbt/sbt eclipse