특장점

There are comprehensive usage guides for many languages.

확장은 쉽게, 노드를 풀에 던지기만 하면 됩니다.

Scalability

Hello World 예제

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.

Actor 예제

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!

WebSocket 예제

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()
  }
}

SockJS 예제

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 프로젝트 생성하기

xitrum-new project 를 참고하여

xitrum-new.zip 파일을 다운로드, 압축을 풀고, 실행합니다:

sbt/sbt run

빈 프로젝트가 http://localhost:8000/https://localhost:4430/ 에서 가동되는것을 볼 수 있습니다.

Eclipse 프로젝트 생성:

sbt/sbt eclipse

News

CHANGELOG