Я отлаживаю код Java, который использует Apache POI для извлечения данных из документов Microsoft Office. Иногда он сталкивается с большим документом, и POI падает, когда заканчивается память. В этот момент он пытается опубликовать ошибку в RabbitMQ, так что другие компоненты могут знать, что этот шаг не прошел и предпримет соответствующие действия. Однако, когда он пытается опубликовать в очередь, он получает com.rabbitmq.client.AlreadyClosedException (clean connection shutdown; reason: Attempt to use closed channel)
.
Здесь код обработчика ошибок:
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. Существуют ли какие-либо обстоятельства, при которых канал может быть закрыт неявно?
EDIT: я должен отметить, что AlreadyClosedException вызывается вызовом basicPublish
внутри публикации.