2016-09-27 10 views
0

Итак, у меня есть приложение для воспроизведения RESTful, которое взаимодействует (или скоро будет взаимодействовать) с несколькими другими микро-успокаивающими услугами.Как я могу запустить прослушиватель Runnable RabbitMQ, когда начнется приложение scala для запуска фреймворка?

Однако мне нужно запустить свой класс Runnable RabbitMQ вскоре после запуска игры, чтобы я мог вызвать некоторых аккских актеров, чтобы делать что-то.

Пока у меня есть приложение, отвечающее на «GET» маршруты// статус, и все хорошо, но я продолжаю привязываться к «Запланированным заданиям» как способ выполнить фоновое задание в Play. Это правильный способ сделать это?

system.scheduler().scheduleOnce() ??

Как предложено здесь: Running a continuous background task in Play 2.4.2 server


Edit: Попытка, что предложил Lief Эриксон, но получаю сообщение об ошибке:

//@Singleton Get the error below when I uncomment this <<----- 
class Test extends Runnable { 

    val logger: Logger = LoggerFactory.getLogger(this.getClass.getName) 

    def run() = { 
    while(true) { 
     logger.info("I'm here #################") 
     Thread.sleep(10000) 
    } 
    } 
} 

class Bindings extends AbstractModule { 

    val logger: Logger = LoggerFactory.getLogger(this.getClass.getName) 

    override def configure() = { 
    logger.info("Configuring application ....") 
    bind(classOf[Test]).asEagerSingleton() 
    } 
} 

Ошибка:

[error] C:\PROJECTS\active\voldemort\app\controllers\Application.scala:29: trait Singleton is abstract; cannot be instantiated 
[error] @Singleton 
[error]^

Но когда я закомментируйте singleton decorator, я получаю сообщение журнала "Configuring application ..." просто отлично, но n ВЗ I'm here ######### лаглинь

+0

Другая альтернатива: следует ли распространять GlobalSettings и делать это именно так? – dlite922

ответ

1

Вам нужно создать класс, скажем RabbitListener, и начать что слушатель в конструктор класса:

@Singleton 
class RabbitListener(listener: Listener[T]) { 
    listener.run() 
    ... 
} 

Затем вам нужно, чтобы сделать этот класс нетерпеливо нагрузку, используя Guice Module:

import com.google.inject.AbstractModule 
class Bindings extends AbstractModule { 
    override def configure() = { 
    bind(classOf[RabbitListener]).asEagerSingleton() 
    } 
} 

Затем вам нужно зарегистрировать модуль в application.conf:

play.modules.enabled += org.example.Bindings 

Некоторые ссылки здесь: https://www.playframework.com/documentation/2.5.x/GlobalSettings#scala

+0

Я просто читал пару страниц на DI и Module и, конечно же, прочитал связанную вами страницу (возможно, несколько раз), но как вы ее нашли на этой странице? Я искал AbstractModule или play.modules.enabled на этой странице и получил нулевые образы? Игровой документации по-прежнему не хватает для n00bs, которым требуется немного больше рук. Но я попробую выше ... – dlite922

+0

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

+0

Какой пакет AbstractModule в? play.api? – dlite922

0

Я получил это работает, вот уродливое решение (которое я знаю, это не правильный способ делать вещи, так что надеюсь, кто-то может ответить), но это работает, и делает то, что мне нужно (чтобы прослушать вызовы отдыха, но также запустить фоновый прослушиватель RMQ)

case object StartConsumingMessage 

class RabbitMQConsumer { 
    val logger: Logger = LoggerFactory.getLogger(this.getClass.getName) 
    logger.info("Voldemort Actor System starting...") 
    val system = ActorSystem("VoldemortSystem") 
    val actor = system.actorOf(Props(new RMQConsumerActor())) 
    implicit val timeout = Timeout(300 seconds) 
    actor ! StartConsumingMessage 

} 

class Bindings extends AbstractModule { 

    val logger: Logger = LoggerFactory.getLogger(this.getClass.getName) 

    override def configure() = { 
    logger.info("Configuring application ....") 
    bind(classOf[RabbitMQConsumer]).asEagerSingleton() 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^