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 ответ

Решение

Создавать и уничтожать и контекст, и сокет не идиоматично, особенно в тесном цикле. Вы должны только когда-либо создавать один контекст и внедрять его в свое приложение. Вам будет гораздо лучше, если вы кешируете сокет.

Другие вопросы по тегам