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