Я отлаживаю некоторый Java-код, который использует Apache POI для извлечения данных из документов Microsoft Office. Иногда он сталкивается с большим документом, и POI дает сбой, когда ему не хватает памяти. На этом этапе он пытается опубликовать ошибку в RabbitMQ, чтобы другие компоненты могли узнать, что этот шаг завершился неудачно, и предпринять соответствующие действия. Однако при попытке публикации в очереди возникает исключение com.rabbitmq.client.AlreadyClosedException (чистое отключение соединения; причина: попытка использовать закрытый канал)
.
Вот код обработчика ошибок:
try {
//Extraction and indexing code
}
catch(Throwable t) {
// Something went wrong! We'll publish the error and then move on with
// our lives
System.out.println("Error received when indexing message: ");
t.printStackTrace();
System.out.println();
String error = PrintExc.format(t);
message.put("error", error);
if(mime == null) {
mime = "application/vnd.unknown";
}
message.put("mime", mime);
publish("IndexFailure", "", MessageProperties.PERSISTENT_BASIC, message);
}
Для полноты, вот метод публикации:
private void publish(String exch, String route,
AMQP.BasicProperties props, Map<String, Object> message) throws Exception{
chan.basicPublish(exch, route, props,
JSONValue.toJSONString(message).getBytes());
}
Я не могу найти код в блоке try, который, кажется, закрывает канал RabbitMQ. Существуют ли обстоятельства, при которых канал может быть закрыт неявно?
РЕДАКТИРОВАТЬ : Я должен отметить, что исключение AlreadyClosedException генерируется вызовом basicPublish
внутри publish.