in nmr/core/src/main/java/org/apache/servicemix/nmr/core/ChannelImpl.java [314:346]
protected void handleFailure(InternalExchange exchange, RuntimeException e, boolean dispatch) {
logger.warn("Error processing exchange {}", exchange, e);
if (dispatch) {
exchange.setError(e);
for (ExchangeListener l : nmr.getListenerRegistry().getListeners(ExchangeListener.class)) {
l.exchangeFailed(exchange);
}
// Rethrow the exception so that sendSync are unblocked
throw e;
} else {
// If the exchange is active, let's try to send an error on behalf of the endpoint
if (exchange.getStatus() == Status.Active) {
try {
exchange.setError(e);
send(exchange);
} catch (RuntimeException e2) {
for (ExchangeListener l : nmr.getListenerRegistry().getListeners(ExchangeListener.class)) {
l.exchangeFailed(exchange);
}
}
} else {
exchange.setError(e);
Semaphore lock = exchange.getRole() == Role.Provider ? exchange.getConsumerLock(false)
: exchange.getProviderLock(false);
if (lock != null) {
lock.release();
}
for (ExchangeListener l : nmr.getListenerRegistry().getListeners(ExchangeListener.class)) {
l.exchangeFailed(exchange);
}
}
}
}