首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grails非基于时间的排队

Grails非基于时间的排队
EN

Stack Overflow用户
提问于 2012-03-02 06:30:14
回答 2查看 411关注 0票数 3

我需要处理上传的文件,这可能需要1秒或10分钟。目前,我的解决方案是使用30秒的计时器创建一个quartz作业,然后在命中时处理任意作业。这有几个问题。

其一:如果作业的执行时间少于几秒钟,那么让作业队列等待30秒是很浪费的。

第二:如果队列中只有一个长作业,它可以可行地尝试做两次。

我想要的是一个永恒的队列。当添加东西时,如果有空闲的工人,就会立即启动。对此有解决方案吗?我在看jesque,但我不知道它是否能做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-02 06:39:58

您正在寻找的是一个基本的消息队列。有很多选择,但我最喜欢的Grails是RabbitMQ。它的Grails插件相当不错,根据我的经验,它的性能也很好。

一般而言,消息队列允许您让N个生产者(事物创建作业“)将工作消息添加到队列中,然后M个消费者从队列中提取作业并对其进行处理。当一个worker完成其作业时,它只是向队列请求下一个要处理的作业,如果没有下一个作业,它只会等待队列给它一些事情做。队列还会跟踪消息处理的成功/失败(您可以控制),这样您就不会将相同的消息提供给多个worker。

这样做的好处是不依赖于轮询(这样一有东西进来你就可以开始处理了),而且可伸缩性也更好。您可以根据需要扩大或缩小生产者和消费者的规模,将输入与输出解耦,以便您可以获得流量峰值,然后在有可用的资源(工人)的情况下通过它。

票数 2
EN

Stack Overflow用户

发布于 2012-03-02 06:38:05

要解决问题一,只需让作业每5秒(或3秒或1秒)检查一次新上传的文件。如果对上传文件的检查很快,那么你没有理由不经常运行它。

对于第二个问题,您只需要记录开始处理文件的时间,以确保它不会被拾取两次。您可以在数据库中创建一个表,或者将信息存储在内存中的某个位置。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9525214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档