java - Jeromq 最大套接字打开问题

标签 java sockets zeromq jeromq

我在 java 中有一个 server,它接收一个 json 文件并通过 jeromq 将它发送到一个 C 程序。直到上周我才用几个 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 相关的事情,我不确定它是否可以。

最佳答案

创建和销毁 Context 和 Socket 不是惯用的,尤其是在紧密循环中。您应该只创建一个上下文并将其注入(inject)您的应用程序。如果您也缓存套接字,情况会好得多。

关于java - Jeromq 最大套接字打开问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25380162/

相关文章:

java - 为什么用WebDriver找不到这个元素?

java - 如何使用其他值对 Java 中的 Map<String, String> 中的日期进行排序

java - 如何检查android中特定网络类型的可用性?

c++ - 在 C/C++ 中创建和发送数据包

node.js - HAProxy 配置 - 如何使 TCP 连接保持粘性(Node.js、socket.io、websocket、FlashSocket)

java 8 streams 如何将 Map<String, List<Strings>> 转换为 List<String> 将所有字符串值?

sockets - 如何编写没有任何绑定(bind)端口的用户态NAT?

android - 如何解决从 ZeroMQ 库抛出的这个异常?

linux - nc 访问的 ZeroMQ IPC Unix 域套接字

czmq 多个 zactor 实例崩溃