2014-08-30 4 views
1

я использовал конфигурацию типизированного Config, чтобы получить переменную окружения, как это:

service { 
    host = "localhost" 
    host = ${?HOST} 
    port = 8080 
    port = ${?PORT} 
    ports { 
     tcp = 6969 
     ws = 6696 
    } 
} 

И в моем Boot.scala я писал:

val host = config.getString("service.host") 
    val portHTTP = config.getInt("service.port") 
    val rootService = system.actorOf(Props(new RootService())) 

    IO(Http) ! Http.Bind(rootService, interface = host, port = portHTTP) 

предполагается, что это будет просто отлично! И увидел я heroku log информации:

2014-08-30T17:39:38.867872+00:00 app[web.1]: [spray-blog-akka.actor.default-dispatcher-4] [akka://spray-blog/user/IO-HTTP/listener-0] Bound to localhost/127.0.0.1:25870 
2014-08-30T17:40:37.007696+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch 

Похоже, я уже привязан к определенному порту: Bound to localhost/127.0.0.1:25870, но через 60 секунд Heroku все еще говорит, что я не связывался с ним во время!

Я скопировал и вставил свой стартовый скрипт из Heroku при условии, пример приложения: web: target/start com.mturk.Boot -Dhttp.port=${PORT} -Dconfig.file=conf/application.conf

Я не могу понять, в чем проблема! Так расстроен !!

ответ

3

Я считаю, что Heroku сообщает вам порт, который вы должны использовать. Вы можете подобрать переменную окружения $ PORT от Heroku в вашем Boot.scala с дополнительной строки кода

вал myPort = Properties.envOrElse ("PORT", "8080"). ToInt // для Heroku совместимость

IO (Http) (система)! Http.Bind (rootService, "0.0.0.0", порт = myPort)

Вам может понадобиться дополнительный импорт курса:

импорт util.Properties

0

ОТКАЗ Просто дать вам подсказку о том, как потенциально решить эту проблему. Прошу прощения, если ответ действительно не поможет.

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

Я использую следующие build.sbt, так что я могу работать с типизированным Config:

libraryDependencies += "com.typesafe" % "config" % "1.2.1" 

Никаких других файлов не находятся в проекте.

Я запустил sbt с SBT_OPTS="-Dhttp.port=10876", чтобы имитировать, как Heroku передает конфигурацию приложениям - через свойства системы.

➜ typesafe-config SBT_OPTS="-Dhttp.port=10876" xsbt 
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins 
[info] Set current project to typesafe-config (in build file:/Users/jacek/sandbox/typesafe-config/) 
> console 
[info] Updating {file:/Users/jacek/sandbox/typesafe-config/}typesafe-config... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Starting scala interpreter... 
[info] 
Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_20). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> import com.typesafe.config.ConfigFactory 
import com.typesafe.config.ConfigFactory 

scala> val conf = ConfigFactory.load() 
conf: com.typesafe.config.Config = Config(SimpleConfigObject({"awt":{"toolkit":"sun.lwawt.macosx.LWCToolkit"},"file":{"encoding":... 

scala> conf.getInt("http.port") 
res0: Int = 10876 

Вы можете попробовать использовать http.port не HOST, чтобы проверить, является ли или не передается переменная окружения для вашего приложения?