在播客 #15 中,Jeff 提到他在 Twitter 上谈到了如何在后台运行常规事件,就好像它是一个正常功能一样 - 不幸的是我似乎无法通过 Twitter 找到它。现在我需要做类似的事情,并将这个问题抛给大众。

我当前的计划是,当第一个用户(可能是我)进入站点时,它会启动一个后台线程,等待分配的时间(每小时),然后启动阻止其他用户的事件(我是一名 Windows 程序员,所以我认为就事件和 WaitOnMultipleObjects 而言)直到它完成。

Jeff 是如何在 Asp.Net 中做到这一点的?他的方法是否适用于 Java Web 应用程序世界?

有帮助吗?

解决方案

我认为开发用于运行后台任务的自定义解决方案并不总是值得的,因此我建议使用 石英调度程序 在爪哇。

在您的情况下(需要在 Web 应用程序中运行后台任务),您可以使用发行版中包含的 ServletContextListener 来 在 Web 容器启动时初始化引擎.

之后,您有多种可能性来启动(触发)您的后台任务(作业),例如您可以使用日历或类似 cron 的表达式。根据您的情况,您很可能应该解决 简单触发器 允许您以固定的、有规律的时间间隔运行作业。

这些作业本身也可以在 Quartz 中轻松描述,但是您没有提供有关需要运行的内容的任何详细信息,因此我无法提供该领域的建议。

其他提示

如前所述,Quartz 是一种标准解决方案。如果您不关心重新启动后后台任务的集群或持久性,则可以使用内置的 ThreadPool 支持(在 Java 5,6 中)。如果您使用 预定执行服务 您可以将 Runnables 放入后台线程池,在执行之前等待特定的时间。

如果您确实关心集群和/或持久性,则可以使用 JMS 队列进行异步执行,尽管您仍然需要某种延迟后台任务的方法(您可以使用 Quartz 或 ScheduledExecutorService 来执行此操作)。

Jeff 的机制是创建某种缓存对象,ASP.Net 会以某种间隔自动重新创建该对象 - 它似乎是 ASP.Net 特定的解决方案,因此在 Java 世界中可能不会对您(或我)有太大帮助。

https://stackoverflow.fogbugz.com/default.asp?W13117

阿特伍德:嗯,我最初是在 Twitter 上问的,因为我只是想要一些轻量级的东西。我真的不想写一个Windows服务。我觉得那是带外代码。另外,实际完成工作的代码实际上是一个网页,因为对我来说,网站上的逻辑工作单元就是网页。所以,这确实就像我们正在回调网站一样,就像网站中的另一个请求一样,所以我认为它应该保持内联,而我们提出的小方法是在 Twitter 上向我推荐的本质上是向应用程序缓存添加一些具有固定过期时间的内容,然后您有一个回调,因此当过期时,它会调用某个执行该工作的函数,然后您将其添加回具有相同过期时间的缓存中。所以,有点,也许“贫民窟”这个词是正确的。

我的方法一直是必须使用操作系统(即Cron 或 Windows 任务调度程序)以一定的时间间隔加载特定的 URL,然后在该 URL 处设置一个页面来检查其队列,并执行所需的任何任务,但我很想知道是否有更好的方法。

从文字记录来看,FogBugz 似乎也使用了 Windows 服务加载 URL 的方法。

斯波尔斯基:所以我们有一个名为 heartbeat.asp 的特殊页面。还有那个页面,只要你点击它,任何人都可以随时点击它:不疼。但是当该页面运行时,它会检查等待任务队列以查看是否有任何事情需要完成。如果有什么事情需要做,它会做一件事,然后再次在该队列中查找,如果还有其他事情要做,它会返回一个加号,并且它返回的整个网页只是一个带有加号的字符在里面。如果没有其他事情可做,队列现在是空的,它返回一个负值。因此,任何人都可以调用它并多次点击它,您可以在网络浏览器中加载 heartbeat.asp,然后按 Ctrl-R Ctrl-R Ctrl-R Ctrl-R 直到您开始得到减号而不是加号。当您完成此操作后,FogBugz 将完成其需要执行的所有维护工作。这就是第一部分,第二部分是一个运行的非常非常简单的 Windows 服务,它的全部工作就是调用 heartbeat.asp,如果它得到一个加号,则很快再次调用它,如果它得到一个减号调用再次,但不是一段时间。所以基本上有一个始终运行的 Windows 服务,它有一个非常非常非常简单的任务,只需点击一个 URL,然后查看它是否获得加号或减号,然后根据是否再次运行来安排它的运行时间。它有一个优点或缺点。显然,您可以在此主题上进行任何您想要的变体离开我还有更多工作要做。”这就是它的工作方式...这样维护服务就可以运行,你知道,就像运行该维护服务的半页代码,它永远不需要更改,并且里面没有任何逻辑,它只是包含导致这些网页以一定的保证频率被调用的痒痒。在 heartbeat.asp 的网页中,有一些代码维护需要完成的任务队列,并查看已经过去了多少时间,并且进行深夜维护,并且每 7 天删除所有旧消息已被标记为垃圾邮件和各种只是维护后台任务。呃,就是这样做的。

我们用 杰特克朗 用于我们计划的后台任务。它运行良好,如果您了解 cron,它应该对您有意义。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top