Исполнитель не может быть отключен от полученной от Нити Нити
Привет, ребята: Этот вопрос касается потоков, клиентов, Нетти и Нина.
КОНТЕКСТ
Библиотека Ning - это инструмент асинхронного HTTP-запроса, который позволяет нам создавать запросы, ставить их в очередь и обрабатывать их асинхронно. Он опирается на некоторые библиотеки, такие как код JBoss/Netty, вставленный ниже.
ПРОБЛЕМА
Недавно я наткнулся на исключение закрытия потока, которое было выдано этим фрагментом кода в JBoss/Netty ExecutorUtil
учебный класс.
Этот класс, по-видимому, по сути является утилитой для завершения потоков в Netty.
Этот метод вызывал ошибку в веб-клиенте (работающем от Ning), который я использовал, из-за того, что я пытался закрыть HttpClient внутри обработчика для ответа этого клиента.
Вопрос
Каково значение тупика, который пытается избежать этот блок кода? Для получения дополнительной информации, класс можно увидеть по этому адресу URL.
// Check dead lock.
final Executor currentParent = DeadLockProofWorker.PARENT.get();
if (currentParent != null) {
for (Executor e: executorsCopy) {
if (e == currentParent) {
throw new IllegalStateException(
"An Executor cannot be shut down from the thread " +
"acquired from itself. Please make sure you are " +
"not calling releaseExternalResources() from an " +
"I/O worker thread.");
}
}
}
1 ответ
В netty вам не разрешено выключать Executor из IO-Thread (как уже говорит вам исключение;)), это потому, что вы рискуете увидеть тупик. Если вы действительно хотите закрыть Executor из обработчика, вам нужно сделать это в новом потоке. Что-то вроде например:
public void messageReceived(...) {
// in IO-Thread
new Thread(new Runnable() {
public void run() {
//....shutdown here
}
}).start();
}