Возможности

There are comprehensive usage guides for many languages.

Простое масштабирование, за счет создания новых нод.

Scalability

Привет мир!

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

Используя аннотации вы сделаете акторов доступными из сети!

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-new.

Скачайте xitrum-new.zip, распакуйте и выполните:

sbt/sbt run

Теперь у вас есть пустой проект работающий по адресу http://localhost:8000/ и https://localhost:4430/

Для генерации проекта Eclipse:

sbt/sbt eclipse

Новости

Список изменений