【发布时间】:2012-08-08 07:16:16
【问题描述】:
我编写了一个应用程序,它使用Gearman,尤其是java-gearman-service 0.6.2 向一个或多个工人提交工作(客户端)。
现在我正在运行一个无限循环,每 10 秒检查一次是否需要向 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 异常。
我尝试在循环中实例化 Gearman 和 GearmanClient - 并使用以下命令关闭它们:
client.shutdown();
gearman.shutdown();
在所有作业都提交之后,但这会导致:
28 [gearman-1] INFO 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(Unknown Source)
在 org.gearman.impl.server.remote.GearmanServerRemote$InnerGearmanConnectionHandler.onDisconnect(未知来源)
在 org.gearman.impl.core.GearmanConnectionManager$SocketHandlerImpl.onDisconnect(Unknown Source)
在 org.gearman.impl.reactor.SocketImpl.closeConnection(Unknown Source)
在 org.gearman.impl.reactor.SocketImpl.close(Unknown Source)
在 org.gearman.impl.core.GearmanConnectionManager$SocketHandlerImpl$Connection.close(Unknown Source)
在 org.gearman.impl.server.remote.GearmanServerRemote.shutdown(未知来源)
在 org.gearman.impl.GearmanImpl.shutdown(未知来源)
在 MyApplication.start(ClientManager.java:clientShutdownLine)
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(Unknown Source)
在 org.gearman.impl.serverpool.AbstractConnectionController.closeServer(未知来源)
在 org.gearman.impl.serverpool.AbstractConnectionController.onDisconnect(Unknown Source)
在 org.gearman.impl.server.remote.GearmanServerRemote$InnerGearmanConnectionHandler.onDisconnect(未知来源)
在 org.gearman.impl.core.GearmanConnectionManager$SocketHandlerImpl.onAccept(Unknown Source)
在 org.gearman.impl.reactor.NioReactor$1.completed(Unknown Source)
在 org.gearman.impl.reactor.NioReactor$1.completed(Unknown Source)
在 sun.nio.ch.Invoker.invokeUnchecked(未知来源)
在 sun.nio.ch.Invoker$2.run(Unknown Source)
在 sun.nio.ch.AsynchronousChannelGroupImpl$1.run(Unknown Source)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
如何避免 Gearman-Java-Service 在一段时间后产生这么多线程?
【问题讨论】:
标签: java multithreading gearman