java gearman客户端-产生越来越多的线程
我已经编写了一个应用程序,使用0.6.2向一个或多个工人提交作业(客户端) 现在我正在运行一个无限循环,每10秒检查一次是否需要向Jobserver提交一个新作业。这背后有一些逻辑。请注意,我只想提交它们,而不是得到结果或回调 基本上我所做的是:java gearman客户端-产生越来越多的线程,java,multithreading,gearman,Java,Multithreading,Gearman,我已经编写了一个应用程序,使用0.6.2向一个或多个工人提交作业(客户端) 现在我正在运行一个无限循环,每10秒检查一次是否需要向Jobserver提交一个新作业。这背后有一些逻辑。请注意,我只想提交它们,而不是得到结果或回调 基本上我所做的是: Gearman gearman = Gearman.createGearman(); GearmanClient client = gearman.createGearmanClient(); client.addServer(gearman.crea
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();
提交所有作业后,但这会导致:
28[gearman-1]信息gearman-[127.0.1.1:4730]:已连接
634 [main] FATAL main - Exception!
java.lang.NullPointerException
位于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.reactor.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.start(ClientManager.java:clientShutdownLine)
31[gearman-1]信息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.server.remote.GearmanServerRemote$InnerGearmanConnectionHandler.onDisconnect(未知源)
位于org.gearman.impl.core.GearmanConnectionManager$SocketHandlerImpl.onAccept(未知来源)
位于org.gearman.impl.reactor.niorreactor$1.已完成(未知来源)
位于org.gearman.impl.reactor.niorreactor$1.已完成(未知来源)
位于sun.nio.ch.Invoker.invokeUnchecked(未知源)
位于sun.nio.ch.Invoker$2.run(未知源)
位于sun.nio.ch.AsynchronousChannelGroupImpl$1.run(未知源)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)
如何避免Gearman Java服务在一段时间后产生这么多线程?尝试更新到最新版本。我想你可能看到了这些问题:
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();}
}
在到达文件末尾之前,将轮询后台作业上的作业句柄(或错误消息)。这也将允许在提交下一个作业之前完全提交作业
不要在提交之间关闭服务。这会减慢一切。所有已建立的连接都将关闭,您需要重新建立连接以提交下一个作业