gpt4 book ai didi

java - jeromq:关闭上下文失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:59 35 4
gpt4 key购买 nike

编辑:自己解决了,见下文(虽然我不确定我是否在这里偶然发现了一个错误)

使用下面这个简单的 hello-world 请求-回复示例,在程序结束时关闭上下文失败:它要么简单地卡在 ctx.close() 处,要么抛出以下异常:

Exception in thread "reaper-1" java.lang.NullPointerException
at zmq.Ctx.destroy_socket(Ctx.java:327)
at zmq.ZObject.destroy_socket(ZObject.java:144)
at zmq.SocketBase.check_destroy(SocketBase.java:938)
at zmq.SocketBase.start_reaping(SocketBase.java:753)
at zmq.Reaper.process_reap(Reaper.java:133)
at zmq.ZObject.process_command(ZObject.java:114)
at zmq.Reaper.in_event(Reaper.java:90)
at zmq.Poller.run(Poller.java:233)
at java.lang.Thread.run(Thread.java:724)

无论哪种方式,程序都不会停止。

这是代码(请注意套接字都在创建它们的线程中关闭):

import org.zeromq.ZMQ;
import org.zeromq.ZContext;

public class App {
public static void main(String[] args) throws InterruptedException {
final ZContext ctx = new ZContext();

final Thread t1 = new Thread() {
@Override
public void run() {
ZMQ.Socket socket = ctx.createSocket(ZMQ.REQ);
socket.connect("inproc://test");
System.err.format("[Thread %s] socket connected%n", Thread.currentThread().getId());
socket.send("hello");
System.err.format("[Thread %s] hello sent%n", Thread.currentThread().getId());
String result = socket.recvStr();
System.err.format("[Thread %s] received response '%s'%n", Thread.currentThread()
.getId(), result);
socket.close();
System.err.format("[Thread %s] socket closed%n", Thread.currentThread().getId());
ctx.destroySocket(socket);
System.err.format("[Thread %s] socket destroyed%n", Thread.currentThread().getId());
}
};
// t1.start();

final Thread t2 = new Thread() {
@Override
public void run() {
ZMQ.Socket socket = ctx.createSocket(ZMQ.REP);
socket.setLinger(10000);
socket.bind("inproc://test");
System.err.format(" [Thread %s] socket bound%n", Thread.currentThread().getId());
String request = socket.recvStr();
assert request == "hello";
System.err.format(" [Thread %s] received request '%s'%n", Thread.currentThread()
.getId(), request);
socket.send("world");
socket.close();
System.err.format(" [Thread %s] socket closed%n", Thread.currentThread().getId());
ctx.destroySocket(socket);
System.err.format(" [Thread %s] socket destroyed%n", Thread.currentThread().getId());
}
};
t2.start();
Thread.sleep(2000);
t1.start();

System.err.println("waiting on the threads to finish...");
t1.join();
t2.join();

System.err.println("closing context...");
ctx.close();
}
}

编辑:已解决

事实证明 socket.close() 不起作用,ctx.destroySocket(socket) 就足够了(它还关闭了套接字)。所以删除 socket.close() 解决了这个问题。这是错误吗?

最佳答案

有同样的问题;这不是一个错误,使用一个或另一个,而不是两个,但使用 ZContext 方法,它们更有效。

close() 显式关闭套接字,因此之后调用 ctx.destroySocket() 会抛出该异常。如果需要关闭套接字,请使用 ctx.destroySocket(),根本不要使用 close(),始终使用 ctx.destroy() 在正常关闭和退出之前关闭上下文,它将自动关闭从该上下文创建的任何套接字。

关于java - jeromq:关闭上下文失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17831295/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com