Scala: Akka с нуля. Часть 1. Приветствие.

Я не обладаю знаниями и опытом программирования на scala, но надо с чегото-то начинать, поэтому планирую написать серию статей, начиная с создание проекта и заканчивая созданием кластера на akka.

Представлять scala я не буду, тот кто хочет может заглянуть в wikipedia. Итак я буду использовать:

Все это можно смело скачать/распаковать в ~/.usr и добавить в ~/.bashrc строчку:

export PATH="$HOME/.usr/bin:$PATH"
Примечание:
сразу оговорюсь, что далее буду указывать пути как будто ~/.usr - это корень для sbt и scala

Начнем с обучения sbt магии eclipse, для этого открываем ~/.usr/conf/sbtopts и правим/добавляем строчку:

-sbt-dir $HOME/.usr/etc/sbt

Теперь ваши глобальные настройки sbt будут браться не из ~/.sbt/<version>, а из ~/.usr/etc/sbt (это больше для любителей все держать в одном каталоге).

Подключаем plug in sbteclipse создавая файл /.usr/etc/sbt/plugins/plugins.sbt:

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")

Настройки остались позади, теперь создадим проект. Я его обозвал taka ( Test AKkA :) ):

$ mkdir taka
$ cd taka
$ mkdir -pv src/{main,test}/{scala,resources}

Необходимо создать каталоги src самостоятельно иначе sbt не укажет их в .classpath файле (почитать про пути по умолчанию и как их изменить http://www.scala-sbt.org/0.13/docs/Howto-Customizing-Paths.html )

Пишем build.sbt:

// Зададим специфичные настройки для SbtEclipse
import com.typesafe.sbteclipse.plugin.EclipsePlugin.EclipseKeys

// Имя проекта
name := "taka"
version := "0.0.1"
scalaVersion := "2.11.7"
// Переменная как в scale
val akkaVesion="2.3.12"
// Зависимости можно добавлять по одному
libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % "test"
// или целым скопом
libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-actor" % akkaVesion,
  "com.typesafe.akka" %% "akka-testkit" % akkaVesion,
  "com.typesafe.akka" %% "akka-cluster" % akkaVesion
)

// Настройки для SbtEclipse plugin
// все отсюда: https://github.com/typesafehub/sbteclipse/wiki/Using-sbteclipse
// помимо исходников нам будут нужны ресурсы
EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource
EclipseKeys.projectFlavor := EclipseProjectFlavor.Scala
// Можно набрать eclipse with-source=true бдует то же самое
// Скачать исходники от зависимостей ( см libraryDependencies )
EclipseKeys.withSource := true

Приготовления сделали, теперь создаем eclipse проект набираем:

sbt eclipse

Если что-то пошло не так, нужно убедиться что после запуска, sbt напечатал строчку похожую на:

[info] Loading global plugins from /home/sprit/.usr/etc/sbt/plugins

Если в конце показалась:

[info] Successfully created Eclipse project files for project(s):
[info] taka

то все хорошо и осталось только импортировать проект.

Открываем eclipse и далее по пунктам:

  • Меню "File" -> "Import"
  • Секция "General" -> "Existing Projects into Workspace" и щелк "Next >"
  • "Select root directory:" выбираем директорию где лежит build.sbt
  • Щелк "Finish".
scala ide proj imported

Теперь создадим первый пакет,класс,тест:

  • Правой кнопкой мыши по src/main/scala меню "New" -> "Package" и OK ( имя автоматом выставиться в taka )
  • Правой щелк по src/main/scala меню "New" -> "Scala Class", пишем "taka.Greeting" и щелк "Finish"
  • Правой кнопкой мыши по src/test/scala меню "New" -> "Package" и OK ( имя автоматом выставиться в taka )
  • Правой щелк по src/test/scala меню "New" -> "Scala Class", пишем "taka.GreetingTest" и щелк "Finish"

Есть класс Greeting и тест GreetingTest. OK. Заполняем GreetingTest:

package taka

import org.scalatest.FunSuite
import org.scalatest.Matchers

class GreetingTest extends FunSuite
                   with Matchers {
  test("One is One") {
    1 should be (1)
  }
}

Теперь надо запустить это чудо, для этого придеться установить ScalaTest плагин для eclipse:

  • Меню "Help" -> "Install New Software..."
  • Выбираем "Work with:" "Scala IDE - <...>"
  • В "Scala IDE plugin (incubation)" "Scala Test for Scala IDE" щелк "Next >"
  • Устанавливаем и перезагружаем eclipse
scala ide install scala test plugin

Как запустился, заходим в GreetingTest.scala и щелкаем правой на GreetingTest в меню "Run As" -> "ScalaTest-Suite". Все первый тест запушен и надеюсь он успешный, можно побалаваться чтобы он провалился для получения опыта. Настало время для написания теста на akka. В лучших традициях TDD сначала изменим тест:

package taka

import org.scalatest.BeforeAndAfterAll
import org.scalatest.FunSuiteLike
import org.scalatest.Matchers

import akka.actor.ActorSystem
import akka.testkit.TestActorRef
import akka.testkit.TestKit

class GreetingTest extends TestKit(ActorSystem("testSystem"))
    with FunSuiteLike
    with Matchers
    with BeforeAndAfterAll {

  override def afterAll(): Unit = {
    system.shutdown()
  }

  test("Say your name") {
    val ref = TestActorRef[Greeting]
    ref ! ("My name is", "Anthony")
    ref ! ("My name is", "Sara")
  }

  test("One is One") {
    1 should be(1)
  }
}

Запускаем, и о чудо оно пишет "All tests passed.", а дело в том что оно даже не скомпилировалось и запустились предыдущие успешные тесты. Но теста "Say your name" там не будет. Создаем реализацию:

package taka

import akka.actor.Actor

class Greeting extends Actor {
  def receive = {
    case ("My name is", name: String) =>
      println("*** Hello, " + name + "!")
    case _ =>
      println("*** Hello stranger")
  }
}

Напоследок хотеться привести список горячих клавиш, которые мне полюбились:

Подсказка как исправить ошибку Ctrl + 1
Авто дополнение Ctrl + Space
Отформатировать исходный код Ctrl + Shift + F
Оптимизировать/исключить import директивы Ctrl + Shift + O
Перейти на следующую/предыдущую вкладку Ctrl + PgUp/PgDown
Refactoring: Переименование Alt + Shift + R