Gearman、特にjava-gearman-service 0.6.2を使用して、1人以上のワーカーにジョブ(クライアント)を送信するアプリケーションを作成しました。
現在、無限ループを実行して、新しいジョブをJobserverに送信する必要があるかどうかを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();
すべてのジョブが送信された後、これは次の結果になります。
28 [gearman-1] INFOギアマン-[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] INFOギアマン-[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.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が時間の経過とともに大量のスレッドを生成するのを回避するにはどうすればよいですか?