在多线程执行中关闭JeroMQ Worker的套接字



考虑以下工作人员:

public class Worker implements Callable<String> ....
// initialize context
@Override
public String call() {
ZMQ.Socket pullSocket = context.socket(ZMQ.PULL);
pullSocket.connect(HOST_PULL_SOCKET);
while (!Thread.currentThread().isInterrupted() && !context.isClosed()) {
String result = pullSocket.recvStr();
return result;
}
return "test";
}

pullSocket.recvStr()抛出java.nio.channels.ClosedByInterruptException作为以下场景

ExecutorService service = Executors.newFixedThreadPool(4);
List<Worker> workers = new ArrayList<>();
for(int i = 0: i < 4;i++){
workers.add(new Worker()); // Class where call() is executed
}
String result = service.invokeAny(workers);

执行。

如何避免这种异常,或者在调用invokeAny()时,处理套接字关闭的首选方法是什么?

您收到此异常是因为executor已关闭,或者可能在程序的某个位置有System.exit()调用。通常情况下,当nio通道被阻塞的线程被中断时,您会遇到此异常。这是停止处理当前任务的信号-让任务对此请求负责-您可以登录、清除资源并退出任务。据我所知,你并不希望你的工作线程被中断——检查你的程序代码——并停止中断。

最新更新