protected void handleFailure()

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);
                }
            }
        }
    }