Работа работника Heroku. Как настроить рабочий процесс вместе с play framework web

Я извиняюсь, если на это уже был дан ответ; мой поиск никого не выявил.

У меня есть игровое приложение, развернутое на Heroku. У меня также есть еще один рабочий класс с основным методом в той же сборке. Я хочу запустить этот класс как рабочий, а не веб-сайт. Когда я пытаюсь запустить его, он выдает исключение ClassDefNotFound, что очевидно, потому что я не предоставляю путь к классам для этого процесса.

Как мне выяснить, каким должен быть путь к классам (как банки, так и классы)? Или есть другой способ сделать это?

Причина для того, чтобы поместить этот класс в отдельный рабочий процесс, состоит в том, чтобы масштабировать его независимо от веб-приложения.

Вот подробнее. Мой Procfile имеет следующие записи,

web: target/start -Dhttp.port=$PORT -DapplyEvolutions.default=true -DapplyDownEvolutions.default=true -Ddb.default.url=$DATABASE_URL ${JAVA_OPTS}
worker: target/start com/company/test/worker/WorkerApplication ${JAVA_OPTS}

worker содержит только имя класса WorkerApplication, который необходимо запустить, но Heroku не может найти эти файлы классов и другие зависимости.


person msabiransari    schedule 17.04.2013    source источник


Ответы (3)


Вам необходимо создать в проекте несколько глобальных объектов с разными именами для каждой точки входа. Затем в вашем Procfile вы указываете, какой из них вы начинаете со свойством application.global, например так:

web:     target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -Dapplication.global=Web
worker:  target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -Dapplication.global=Worker

Я не пробовал это с проектом Play, но вы также можете заставить его работать с плагин sbt-start-script для создания пользовательского сценария target/start с правильным путем к классам.

person ryanbrainard    schedule 18.04.2013
comment
Если дважды использовать один и тот же ${PORT}, не будет ли у нас конфликта на порту? Запускает ли Heroku рабочий процесс, используя другой параметр порта? - person anfuerer; 13.11.2013
comment
Каждая строка Procfile запускается в своем собственном dyno (т.е. контейнере) с собственным портом, поэтому конфликта портов нет. - person ryanbrainard; 13.11.2013
comment
В моей версии Play (2.0.4) это -Dglobal=..., а не -Dapplication.global=... — обратите внимание, что документы неверны: playframework.com/documentation/2.0.4/ScalaGlobal - person jsalvata; 12.12.2013

Хорошо, я понял это. target/start предназначен для Интернета, а не для рабочих. Я нашел все банки в папке target/stage. Смена работника на следующего работает нормально.

рабочий: java -cp "target/staged/*" com/company/test/worker/WorkerApplication

person msabiransari    schedule 23.04.2013

Недавно мы открыли исходный код нашей платформы отложенных заданий, Moonlight, для Playframework на Heroku.

Отложенная работа обычно требует некоторой координации. Например, вам может понадобиться очередь, чтобы рабочий мог получить задание из очереди и обработать его. Moonlight сделает это за вас.

Для вашего конкретного вопроса о Procfile у нас есть рабочий пример здесь: https://github.com/GIVESocialMovement/moonlight/blob/master/test-project/Procfile

Ваш путь к классам не должен содержать /, и я думаю, вам нужен аргумент -main.

person Tanin    schedule 30.07.2018