我编写了一个应用程序,使用Gearman,特别是java-gearman-service 0.6.2将作业(客户端)提交给一个或多个 worker 。
现在,我正在运行一个无限循环,每隔10秒检查一次,是否需要向作业服务器提交新的作业。这背后有一些逻辑。请注意,我只想提交它们,而不要得到结果或回调。
基本上我要做的是:
Gearman gearman = Gearman.createGearman();
GearmanClient client = gearman.createGearmanClient();
client.addServer(gearman.createGearmanServer("someip",somePort);
while(true) {
// get the jobs to submit from the application logic
client.submitBackgroundJob("functionname","dataBytes");
// sleep for a few seconds.
}
这将产生越来越多的线程,直到消耗了太多内存,将引发OutOfMemory
异常。我试图在循环中实例化
Gearman
和GearmanClient
,并使用以下命令将其关闭:client.shutdown();
gearman.shutdown();
在提交所有乔布斯之后,但这导致:如何避免Gearman-Java-Service在时间后产生大量线程?
最佳答案
尝试更新到最新版本。我认为您可能会看到以下问题:
还要注意submitBackgroundJob是一个异步调用,并且后台正在发生一些排队。如果提交作业的速度快于客户端提交作业的速度,则会发生内存不足的异常。鉴于您似乎正在等待几秒钟,可能并非如此,但是请尝试以下操作:
Gearman gearman = Gearman.createGearman();
GearmanClient client = gearman.createGearmanClient();
client.addServer(gearman.createGearmanServer("someip",somePort);
while(true) {
// get the jobs to submit from the application logic
GearmanJobReturn jobReturn = client.submitBackgroundJob("functionname","dataBytes");
while(!jobReturn.isEOF()) {jobReturn.poll();}
}
GearmanJobReturn将在到达文件末尾之前轮询后台作业的作业句柄(或错误消息)。这也将允许在提交下一个作业之前完全提交该作业。
不要在提交之间关闭服务。这减慢了一切。已建立的所有连接均已关闭,您需要重新建立连接以提交下一个作业。
关于java - java-gearman-client-产生越来越多的线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11859508/