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