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>
)
}
}
The above action runs directly on Netty's IO thread pool.
It's very fast if your action is simple.
If it's more complex, avoid blocking
request receiving and response responding,
by running it on another thread pool,
by extending 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()
}
}
Just annotate your actors and they will be accessible from web!
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 project 를 참고하여
xitrum-new.zip 파일을 다운로드, 압축을 풀고, 실행합니다:
sbt/sbt run
빈 프로젝트가 http://localhost:8000/ 와 https://localhost:4430/ 에서 가동되는것을 볼 수 있습니다.
Eclipse 프로젝트 생성:
sbt/sbt eclipse