Закрытие сокетов JeroMQ-Worker в многопоточном исполнении - PullRequest
0 голосов
/ 07 декабря 2018

рассмотрим следующего работника:

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()?

1 Ответ

0 голосов
/ 07 декабря 2018

Вы получаете это исключение, потому что executor был выключен или, возможно, в каком-то месте вашей программы у вас есть System.exit() вызов.В общем, вы получаете это исключение, когда поток, в котором был заблокирован nio chanel, был прерван.Это сигнал, чтобы остановить обработку текущей задачи - сделать задачу ответственной за этот запрос - вы можете войти, очистить ресурсы и выйти из задачи.Как я понимаю, вы не ожидаете, что ваш рабочий поток будет прерван - проверьте код вашей программы - и остановите прерывание.

...