2012-08-08 65 views
3

我已經編寫了一個應用程序,使用Gearman向一個或多個工作人員提交作業(客戶端),尤其是java-gearman-service 0.6.2。java-gearman-client - 生產越來越多的線程

現在我運行一個無限循環來檢查每10秒是否需要將新Job提交給Jobserver。這背後有一些邏輯。請注意,我只是想提交它們,沒有得到結果或回調。

基本上我做的是:

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(); 

所有作業提交後,但這會導致:

28的Gearman-1 ] INFO gearman - [127.0.1.1:4730]:連接

634 [main] FATAL main - Exception! 

java.lang.NullPointerExce ption

在org.gearman.impl.util.GearmanUtils.toString(未知來源)

在org.gearman.impl.serverpool.AbstractConnectionController.onDisconnect(未知來源)

在org.gearman。 impl.server.remote.GearmanServerRemote $ InnerGearmanConnectionHandler.onDisconnect(來源不明)

在org.gearman.impl.core.GearmanConnectionManager $ SocketHandlerImpl.onDisconnect(來源不明)

在org.gearman.impl.re actor.SocketImpl.closeConnection(來源不明)

在org.gearman.impl.reactor.SocketImpl.close(來源不明)

在org.gearman.impl.core.GearmanConnectionManager $ SocketHandlerImpl $的Connection.close(未知源)

在org.gearman.impl.server.remote.GearmanServerRemote.shutdown(來源不明)

在org.gearman.impl.GearmanImpl.shutdown(來源不明)

在所有MyApplication。啓動(ClientManager.java:c lientShutdownLine)

31 [Gearman的-1] INFO的Gearman - [127.0.1.1:4730]:斷開

java.lang.IllegalStateException

在org.gearman.impl.client.GearmanJobReturnImpl.eof(未知源)

在org.gearman.impl.client.ClientImpl.failTo(來源不明)

在org.gearman.impl.client。ClientImpl.onClose(來源不明)

在org.gearman.impl.client.ClientImpl.access $ 700(來源不明)

在org.gearman.impl.client.ClientImpl $ InnerConnectionController.onClose(來源不明)

在org.gearman.impl.serverpool.AbstractConnectionController.closeServer(未知來源)

在org.gearman.impl.serverpool.AbstractConnectionController.onDisconnect(未知來源)

在org.gearman.impl 。服務r.remote.GearmanServerRemote $ InnerGearmanConnectionHandler.onDisconnect(來源不明)

在org.gearman.impl.core.GearmanConnectionManager $ SocketHandlerImpl.onAccept(來源不明)

在org.gearman.impl.reactor.NioReactor $ 1 .completed(來源不明)

在org.gearman.impl.reactor.NioReactor $ 1.completed(來源不明)

在sun.nio.ch.Invoker.invokeUnchecked(來源不明)

在sun.nio.ch.Invoker $ 2.run(來源不明)

在sun.nio.ch.AsynchronousChannelGroupImpl $ 1.run(來源不明)

在java.util.concurrent.ThreadPoolExecutor.runWorker(來源不明)

我如何避免Gearman-Java-Service在一段時間後產生如此多的線程?

回答

0

嘗試更新到最新版本。我想你可能會看到這些問題:

還要注意的是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將輪詢後臺作業的作業手柄(或一個錯誤消息)到達終點前-of文件。這也可以讓你在提交下一份工作之前完整地提交工作。

不要在提交之間關閉服務。這會減慢一切。已經建立的任何連接都已關閉,您需要重新建立連接以提交下一個作業。