有没有一种方法可以在不发送请求的情况下调用Action?

时间:2020-07-22 21:31:24

标签: scala playframework etl devops

我有一个提供一些API的Play2应用。 在同一个应用程序中,我添加了基于Alpakka运行etl的代码。在etl的幕后,有一个Future[Done]运行永无止境。目前,我在单独的路由上通过Web请求触发etl流程。 为了部署我的etl服务,我希望能够使用特殊命令运行我的Play2应用,该命令理想情况下不会打开服务器,而仅运行单个etl控制器动作。如果无法实现并且必须将服务器打开,那么我想触发该etl进程,但将我的etl框与传入的Web连接隔离开。我觉得所有这些都非常骇人听闻,也许还有更好的方法。

1 个答案:

答案 0 :(得分:0)

我最终使用scheduled tasks的方式。

一个任务可以安排一次,具体取决于配置变量:

class ProtonConnector @Inject()(
    config: TypeSafeConfig,
)(
    implicit actorSystem: ActorSystem
) {

  // Run the stream
  def listen: Future[Done] =
    itemsProtonSource.via(mapFlow).via(solrIndexFlow).runWith(Sink.ignore)

  // Schedule ETL execution
  if (config.scheduleProtonEtlTask) {
    actorSystem.scheduler.scheduleOnce(delay = 1.seconds) {
      logger.debug("Executing proton ETL task...")
      val _ = listen
    }
  }
}

然后,我们从environment variable(其值设置为config.scheduleProtonEtlTask)中拾取true(如果执行,则其中的代码块)。 然后,在CI / CD管道中,定义一个新的部署,其中该env变量将由任务配置提供。该部署也可能与外界隔离-这样,Play2仍可以启动服务器,但无法从本地网络外部访问它。