我需要处理上传的文件,它可能需要1秒或10分钟。目前我的解决方案是使用30秒的计时器进行石英作业,然后在它命中时处理和任意作业。这有几个问题。
一:如果工作时间不到几秒钟,那么让工作队列等待30秒是浪费的。
二:如果队列中只有一个长工作,那么可以尝试两次。
我想要的是一个永恒的队列。添加内容时,如果有自由工作人员,则会立即启动。这有解决方案吗?我看着jesque,但我不明白它是否可以做到这一点。
答案 0 :(得分:2)
您正在寻找的是基本的消息队列。那里有很多选择,但Grails最喜欢的是RabbitMQ。它的Grails插件非常好,并且在我的体验中表现良好。
通常,消息队列允许您让N个生成器(创建作业的东西)将工作消息添加到队列中,然后M个消费者将作业从队列中拉出并处理它们。当一个工作者完成它的工作时,它只是询问下一个要处理的作业的队列,如果没有,它只是等待队列给它做的事情。队列还跟踪消息处理的成功/失败(你可以控制它),这样你就不会给同一个工人提供相同的信息。
这样做的好处是不依赖于轮询(因此您可以在事情进入后立即开始处理)并且它也可以更加可扩展。您可以根据需要向上或向下扩展您的生产者和消费者,将输入与输出分离,以便您可以获得流量峰值,然后在您拥有可用的资源(工作人员)时通过它。
答案 1 :(得分:-1)
要解决问题,只需每隔5秒(或3秒或1秒)检查新上传的文件。如果对上传文件的检查很快,则没有理由不能经常运行它。
对于问题二,您只需要在开始处理文件时进行记录,以确保它不会被拾取两次。您可以在数据库中创建一个表,或将信息存储在某个内存中。