2013-02-24 2 views
2

Я вижу, что sbt-revolver настроен и работает на спрее, но мои изменения не появляются, когда я сделать запрос к службе.Scala - Spray.io - sbt-revolver - jrebel - Не вижу изменений в HttpService (или что-либо еще) при перезагрузке

Вы можете увидеть в журналах JRebel делает свое дело:

[success] Total time: 1 s, completed Feb 24, 2013 3:13:18 AM 
app: [INFO] [02/24/2013 03:13:19.497] [com-example-Boot-spray.io.io-bridge-dispatcher-7] [akka://com-example-Boot/user/io-bridge] akka://com-example-Boot/user/io-bridge started 
app: [INFO] [02/24/2013 03:13:19.851] [com-example-Boot-akka.actor.default-dispatcher-2] [akka://com-example-Boot/user/http-server] akka://com-example-Boot/user/http-server started on localhost/127.0.0.1:9000 
>     ~products 
[success] Total time: 0 s, completed Feb 24, 2013 3:13:23 AM 
1. Waiting for source changes... (press enter to interrupt) 
[info] Compiling 1 Scala source to /Users/tripled153/Development/src/Foundationv2/spray-template/target/scala-2.10/classes... 
[success] Total time: 2 s, completed Feb 24, 2013 3:13:33 AM 
2. Waiting for source changes... (press enter to interrupt) 

Но изменение сообщения в моей черте не появляется на обновлениях.

package com.example 

import akka.actor.Actor 
import spray.routing._ 
import spray.http._ 
import MediaTypes._ 


// we don't implement our route structure directly in the service actor because 
// we want to be able to test it independently, without having to spin up an actor 
class MyServiceActor extends Actor with MyService { 

    // the HttpService trait defines only one abstract member, which 
    // connects the services environment to the enclosing actor or test 
    def actorRefFactory = context 

    // this actor only runs our route, but you could add 
    // other things here, like request stream processing 
    // or timeout handling 
    def receive = runRoute(myRoute) 
} 


// this trait defines our service behavior independently from the service actor 
trait MyService extends HttpService { 

    val myRoute = 
    path("") { 
     get { 
     respondWithMediaType(`text/html`) { // XML is marshalled to `text/xml` by default, so we simply override here 
      complete { 
      <html> 
       <body> 
       <h1>Say hello to <i>spray-routing</i> on <i>spray-can</i>!</h1> 
       </body> 
      </html> 
      } 
     } 
     } 
    } 

} 

Это построено на примере распылителя, на котором установлен револьвер. https://github.com/spray/spray-template

+0

Трудно сказать, что не так с вашей настройкой. Вы можете создать пример проекта на github, и я проверю его. – 4e6

+1

Проект - проект шаблона спрей здесь: https://github.com/spray/spray-template/ – JasonG

+1

Он работает для меня. Интересно ... Может быть, это проблема с активацией лицензии jrebel. Вы можете увидеть вывод jrebel на 're-start', например,« Связаться с сервером myJRebel .. »с информацией о версии, лицензии и т. Д.? – 4e6

ответ

2

Проблема в том, что маршрут строится только один раз, когда начинается сервис. Попробуйте завернуть полный маршрут с помощью директивы dynamic, чтобы перестроить его для каждого запроса.

EDIT: См. Это mailing list thread по теме.

+0

Хорошо, большой совет, чтобы добавить в тему. Я уверен, что однажды это поможет кому-то. – JasonG

+0

Я пробовал это, но это не помогло. Спасибо хоть. – JasonG

1

Пожалуйста, убедитесь, что вы установили JREBEL_PATH в свою копию jrebel.jar's Абсолютный путь.

0

Я использовал команду повторного запуска, и JRebel НЕ ловил никаких изменений. Тогда я сделал это:

Start SBT в одном сеансе терминала и выполните команду пуска (это начало, а не команда повторного запуска)

Открыть другую терминальную сессию и запустить SBT с помощью команды ~ компиляции.

И все, что работает SBT в двух отдельных окнах с началом, а команды компиляции сделают трюк.

Очевидно, что JRebel должен быть активным и иметь действующую лицензию.

Помните, что JRebel не перезагружает абсолютное все, когда исходный код был изменен. Обратите особое внимание на кешированные значения, такие как кешированные маршруты или данные. В этом случае вам нужно закодировать простой трюк, чтобы принудительно перезагрузить кеш, может быть временным или просто запросить блокировку файла или даже простое свойство в перезагружаемом классе, который JRebel фактически обновит.