在播客#15中,杰夫提到他对如何在后台运行常规事件感到厌烦,好像这是一个正常的功能 - 不幸的是我似乎无法通过推特找到它。现在我需要做类似的事情,并将问题提交给群众。
我目前的计划是,当第一个用户(可能是我)进入网站时,它会启动一个后台线程,等待分配到的时间(每小时一小时),然后启动阻止其他人的事件(我是Windows程序员)通过交易,所以我认为在事件和WaitOnMultipleObjects方面,直到它完成。
Jeff是如何在Asp.Net中做到的,并且他的方法是否适用于Java web-app世界?
答案 0 :(得分:12)
我认为开发用于运行后台任务的自定义解决方案并不总是值得的,所以我建议在Java中使用Quartz Scheduler。
在您的情况下(需要在Web应用程序中运行后台任务),您可以使用分发中包含的ServletContextListener initialize the engine at the startup of your web container。
之后,您可以通过多种方式启动(触发)后台任务(工作),例如:你可以使用Calendars或类似cron的表达式。在您的情况下,您很可能应该使用SimpleTrigger来解决这个问题,让您以固定的,定期的间隔运行作业。
在Quartz中也可以轻松地描述作业本身,但是你没有提供有关你需要运行的内容的任何细节,因此我无法在该领域提供建议。
答案 1 :(得分:5)
如前所述,Quartz是一种标准解决方案。如果您不关心重新启动时后台任务的集群或持久性,则可以使用内置的ThreadPool支持(在Java 5,6中)。如果使用ScheduledExecutorService,则可以将Runnables放入后台线程池中,该池将在执行前等待一段特定时间。
如果您关心群集和/或持久性,可以使用JMS队列进行异步执行,但仍需要某种方法来延迟后台任务(您可以使用Quartz或ScheduledExecutorService来执行此操作)。
答案 2 :(得分:3)
Jeff的机制是创建某种缓存对象,ASP.Net会在某种间隔自动重新创建 - 它似乎是一个ASP.Net特定的解决方案,所以可能不会帮助你(或我) Java世界。
请参阅https://stackoverflow.fogbugz.com/default.asp?W13117
阿特伍德:嗯,我最初在Twitter上问过,因为我只想要一些轻量级的东西。我真的不想写一个Windows服务。我觉得那是带外码。实际上,实际完成工作的代码实际上是一个网页,因为对我而言,网站上的逻辑工作单元就是网页。所以,它真的就像我们回到网站,它就像网站上的另一个请求,所以我认为它应该保持内联,我们提出的小方法是推荐给我的Twitter本质上是为了向应用程序缓存中添加一些具有固定过期的内容,然后你有一个回调,所以当它到期时它会调用某个函数来完成工作,然后你将它添加回缓存中并具有相同的过期时间。所以,它有一点点,也许“贫民窟”是正确的词。
我的方法一直是操作系统(即Cron或Windows任务调度程序)以某个间隔加载特定的URL,然后在该URL设置一个页面来检查它的队列,并执行所需的任何任务,但是我很想知道是否有更好的方法。
从成绩单看,FogBugz看起来也使用了加载URL方法的Windows服务。
Spolsky:所以我们有一个名为heartbeat.asp的特殊页面。那个页面,每当你点击它,任何人都可以随时点击它:没有伤害。但是当该页面运行时,它会检查等待任务的队列,看看是否有任何需要完成的事情。如果有什么需要做的事情,它会做一件事,然后再次查看该队列,如果还有其他事情要做,则返回一个加号,它返回的整个网页只是一个加号的单个字符在里面。如果没有别的事情要做,队列现在是空的,它返回一个减号。所以,任何人都可以调用它并多次点击它,你可以在你的网络浏览器中加载heartbeat.asp你按Ctrl-R Ctrl-R Ctrl-R Ctrl-R直到你开始得到弊端而不是加号。当你完成后,FogBugz将完成它需要完成的所有维护工作。所以这是第一部分,第二部分是一个非常非常简单的Windows服务运行,它的整个工作是调用heartbeat.asp,如果它得到一个加号,很快再次调用它,如果它得到一个减号调用它再次,但不是一段时间。所以基本上这个Windows服务总是运行,它有一个非常非常非常简单的任务,只需点击一个URL,并查看它是否得到一个加号或减号,然后根据是否再次运行进行调度它有一个加号或减号。显然你可以在这个主题上做任何你想要的变化,例如,呃你实际上,而不是只返回一个加号或减号你可以说“好的,在60秒内给我回电话”或“给我回电话”我还有更多工作要做。“这就是它的工作方式......所以它只是运行它的维护服务,你知道,它就像是运行该维护服务的半页代码,它永远不必改变,它没有任何在那里的逻辑,它只包含导致这些网页以一定的保证频率被调用的挠痒。在heartbeat.asp的网页中,有一些代码可以维护需要完成的任务队列,并查看已经过了多长时间,并且知道深夜维护和每七天删除所有旧消息已被标记为垃圾邮件和各种维护后台任务。呃,那是怎么回事。
答案 3 :(得分:2)
我们将jtcron用于我们的预定后台任务。 它运作良好,如果你了解cron它应该对你有意义。
答案 4 :(得分:1)
以下是他们在StackOverflow.com上的表现:
http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/