我编写了一个应用程序,使用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异常。
我试图在循环中实例化GearmanGearmanClient,并使用以下命令将其关闭:
client.shutdown();
gearman.shutdown();
在提交所有乔布斯之后,但这导致:

如何避免Gearman-Java-Service在时间后产生大量线程?

最佳答案

尝试更新到最新版本。我认为您可能会看到以下问题:

  • http://code.google.com/p/java-gearman-service/issues/detail?id=32&can=1
  • http://code.google.com/p/java-gearman-service/issues/detail?id=33&can=1

  • 还要注意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/

    10-09 16:14