Jeromq максимальный сокет открыл выпуск
У меня есть server
в Яве, которые получают json
файл и отправить его в программу на C jeromq
, До прошлой недели я только что проверил это с несколькими JSON. Я не отправлял много json до сих пор, у меня есть другой компонент для их отправки.
Glassfish
завис с ошибкой, которую я никогда не видел раньше. Что-то вроде:
[2014-08-19T09:24:32.446+0000] [glassfish 4.0] [WARNING] [] [java.util.prefs] [tid: _ThreadID=141 _ThreadName=Timer-1] [timeMillis: 1408440272446] [levelValue: 900] [[
Could not lock User prefs. Unix error code 24.]]
[2014-08-19T09:24:32.446+0000] [glassfish 4.0] [WARNING] [] [java.util.prefs] [tid: _ThreadID=141 _ThreadName=Timer-1] [timeMillis: 1408440272446] [levelValue: 900] [[
Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.]]
И что-то связанное с ZMQ:
[2014-08-15T08:23:30.637+0000] [glassfish 4.0] [SEVERE] [] [] [tid: _ThreadID=2432 _ThreadName=Thread-4] [timeMillis: 140809101063$
zmq.ZError$IOException: java.io.IOException: Too many open files
at zmq.Signaler.make_fdpair(Signaler.java:87)
at zmq.Signaler.<init>(Signaler.java:48)
at zmq.Mailbox.<init>(Mailbox.java:55)
at zmq.Ctx.<init>(Ctx.java:127)
at zmq.ZMQ.zmq_ctx_new(ZMQ.java:225)
at zmq.ZMQ.zmq_init(ZMQ.java:258)
at org.jeromq.ZMQ$Context.<init>(ZMQ.java:173)
at org.jeromq.ZMQ.context(ZMQ.java:155)
...
at java.lang.Thread.run(Thread.java:744)
Caused by: java.io.IOException: Too many open files
at sun.nio.ch.IOUtil.makePipe(Native Method)
at sun.nio.ch.PipeImpl.<init>(PipeImpl.java:42)
at sun.nio.ch.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:50)
at java.nio.channels.Pipe.open(Pipe.java:150)
at zmq.Signaler.make_fdpair(Signaler.java:85)
... 11 more]]
Я думаю, это может быть связано с чем-то, что связано с zmq. Если сервер просто получает несколько JSON, он никогда не зависает.
Я вставляю свой код Java, возможно, я делаю что-то не так или не закрываю что-то:
Сначала я создаю поток, чтобы сделать отправку zmq:
new Thread(new SubmitJSONOnBackground(json, this.context)).start();
Мой класс для запуска в фоновом режиме:
public class SubmitJSONOnBackground implements Runnable {
private Collection<JSON> jsons;
private ServletContext context;
public SubmitObservationOnBackground(Collection<JSON> json, ServletContext context) {
this.jsons = json;
this.context = context;
}
public void run() {
SubmitJSONHandler submit = new SubmitJSONHandler(jsons, this.context);
submit.buildAndSubmitJSON();
}
}
И метод, который отправляет zmq:
private boolean submitJSON(String message) {
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket sender = context.socket(ZMQ.PUSH);
sender.connect("tcp://127.0.0.1:9999");
sender.send(device, ZMQ.SNDMORE);
sender.send("json", ZMQ.SNDMORE);
sender.send("["+message+"]", 0);
sender.close();
context.term();
return true;
}
Я думаю, что это нормально, но так как это не помогает ZMQ
Я не уверен, что это нормально или нет.
1 ответ
Создавать и уничтожать и контекст, и сокет не идиоматично, особенно в тесном цикле. Вы должны только когда-либо создавать один контекст и внедрять его в свое приложение. Вам будет гораздо лучше, если вы кешируете сокет.