按照数据库中指定的时间运行程序

时间:2013-11-06 07:56:28

标签: postgresql debian

项目(仅限上下文)

我目前正在开发一种预订解决方案,客户可以通过将事件拖入日历(也可以移动,编辑,删除)等时尚谷歌日历中来预订网络应用程序中的资源。我的webapp的持久层将预留存储在postgres 9.3的一个表中,其中包含一个开头和结尾(因为timestamp with timezone,因为用户/客户将在不同的时区)。这部分工作正常。 webapp在Debian上运行并与Play一起使用!如果重要,请用scala写。

问题

现在我要解决的问题是,在预订的开始时间,需要运行程序来配置客户端对资源的访问(以及停止时间以及禁用访问)。此外,还需要获取参数,或者至少知道它为何被启动(以便明确表示此时是否预订了多个资源)。如果重要,配置程序将用java或scala编写,并且将在与数据库不同的机器上运行。

编辑:它不需要GUI或任何它只需要运行的东西。

我已阅读的内容

我读过有关LISTENNOTIFY的内容,但我不确定如何使用它来启动我的程序。我对数据库的整个主题都很陌生。这是否是正确的方法?

TL;博士

我尝试在存储在postgres数据库中的时间运行一个程序,但不知道如何。

1 个答案:

答案 0 :(得分:2)

您需要一个外部cron作业或其他定期任务调度程序来查询表并确定是否需要运行某些内容。如果您使用的是Java / Scala,则可以使用在空闲时段休眠的简单线程来完成。或者无论什么时间框架玩!内部包含 - 在Play中看起来像asynchronous jobs! 1.2;如果你使用它,那么在2.x中会有类似的东西。这个答案可能会帮到你:https://stackoverflow.com/a/16982421/398670

您可以让程序在短时间内休眠,然后轮询PostgreSQL连接上的新通知,并在收到通知时重新检查计划。当计划表在数据库中发生更改时,请使用触发器发送NOTIFY,以便轮询客户端知道更新其副本。

轮询程序可以修改其休眠间隔,使其休眠直到事件发生的确切时间,此时它将启动指定的命令。

当NOTIFY进入时,PgJDBC不提供回叫,因此您无法在下一次事件之前睡觉或直到被回叫唤醒。您必须进行短暂睡眠,然后使用PGConnection.getNotifications()

唤醒以轮询通知