我需要处理上传的文件,这可能需要1秒或10分钟。目前,我的解决方案是使用30秒的计时器创建一个quartz作业,然后在命中时处理任意作业。这有几个问题。
其一:如果作业的执行时间少于几秒钟,那么让作业队列等待30秒是很浪费的。
第二:如果队列中只有一个长作业,它可以可行地尝试做两次。
我想要的是一个永恒的队列。当添加东西时,如果有空闲的工人,就会立即启动。对此有解决方案吗?我在看jesque,但我不知道它是否能做到这一点。
发布于 2012-03-02 06:39:58
您正在寻找的是一个基本的消息队列。有很多选择,但我最喜欢的Grails是RabbitMQ。它的Grails插件相当不错,根据我的经验,它的性能也很好。
一般而言,消息队列允许您让N个生产者(事物创建作业“)将工作消息添加到队列中,然后M个消费者从队列中提取作业并对其进行处理。当一个worker完成其作业时,它只是向队列请求下一个要处理的作业,如果没有下一个作业,它只会等待队列给它一些事情做。队列还会跟踪消息处理的成功/失败(您可以控制),这样您就不会将相同的消息提供给多个worker。
这样做的好处是不依赖于轮询(这样一有东西进来你就可以开始处理了),而且可伸缩性也更好。您可以根据需要扩大或缩小生产者和消费者的规模,将输入与输出解耦,以便您可以获得流量峰值,然后在有可用的资源(工人)的情况下通过它。
发布于 2012-03-02 06:38:05
要解决问题一,只需让作业每5秒(或3秒或1秒)检查一次新上传的文件。如果对上传文件的检查很快,那么你没有理由不经常运行它。
对于第二个问题,您只需要记录开始处理文件的时间,以确保它不会被拾取两次。您可以在数据库中创建一个表,或者将信息存储在内存中的某个位置。
https://stackoverflow.com/questions/9525214
复制相似问题