src/main/java/com/alipay/remoting/rpc/protocol/RpcCommandHandler.java
private void processExceptionForSingleCommand(RemotingContext ctx, Object msg, Throwable t) {
        final int id = ((RpcCommand) msg).getId();
        final String emsg = "Exception caught when processing "
                            + ((msg instanceof RequestCommand) ? "request, id=" : "response, id=");
        logger.warn(emsg + id, t);
        if (msg instanceof RequestCommand) {
            final RequestCommand cmd = (RequestCommand) msg;
            if (cmd.getType() != RpcCommandType.REQUEST_ONEWAY) {
                if (t instanceof RejectedExecutionException) {
                    final ResponseCommand response = this.commandFactory.createExceptionResponse(
                        id, ResponseStatus.SERVER_THREADPOOL_BUSY);
                    // RejectedExecutionException here assures no response has been sent back
                    // Other exceptions should be processed where exception was caught, because here we don't known whether ack had been sent back.
                    ctx.getChannelContext().writeAndFlush(response)
                        .addListener(new ChannelFutureListener() {
                            @Override
                            public void operationComplete(ChannelFuture future) throws Exception {
                                if (future.isSuccess()) {
                                    if (logger.isInfoEnabled()) {
                                        logger
                                            .info(
                                                "Write back exception response done, requestId={}, status={}",
                                                id, response.getResponseStatus());
                                    }
                                } else {
                                    logger.error(
                                        "Write back exception response failed, requestId={}", id,
                                        future.cause());
                                }
                            }

                        });
                }
            }
        }
    }
private void processExceptionForSingleCommand(RemotingContext ctx, Object msg, Throwable t) {
        final int id = ((RpcCommand) msg).getId();
        final String emsg = "Exception caught when processing "
                            + ((msg instanceof RequestCommand) ? "request, id=" : "response, id=");
        logger.warn(emsg + id, t);
        if (msg instanceof RequestCommand) {
            final RequestCommand cmd = (RequestCommand) msg;
            if (cmd.getType() != RpcCommandType.REQUEST_ONEWAY) {
                if (t instanceof RejectedExecutionException) {
                    final ResponseCommand response = this.commandFactory.createExceptionResponse(
                        id, ResponseStatus.SERVER_THREADPOOL_BUSY);
                    // RejectedExecutionException here assures no response has been sent back
                    // Other exceptions should be processed where exception was caught, because here we don't known whether ack had been sent back.
                    ctx.getChannelContext().writeAndFlush(response)
                        .addListener(new ChannelFutureListener() {
                            @Override
                            public void operationComplete(ChannelFuture future) throws Exception {
                                if (future.isSuccess()) {
                                    if (logger.isInfoEnabled()) {
                                        logger
                                            .info(
                                                "Write back exception response done, requestId={}, status={}",
                                                id, response.getResponseStatus());
                                    }
                                } else {
                                    logger.error(
                                        "Write back exception response failed, requestId={}", id,
                                        future.cause());
                                }
                            }

                        });
                }
            }
        }
    }
private void processExceptionForSingleCommand ( RemotingContext ctx , Object msg , Throwable t ) { final int id = ( ( RpcCommand ) msg ) . getId ( ) ; final String emsg = "Exception caught when processing " + ( ( msg instanceof RequestCommand ) ? "request, id=" : "response, id=" ) ; logger . warn ( emsg + id , t ) ; if ( msg instanceof RequestCommand ) { final RequestCommand cmd = ( RequestCommand ) msg ; if ( cmd . getType ( ) != RpcCommandType . REQUEST_ONEWAY ) { if ( t instanceof RejectedExecutionException ) { final ResponseCommand response = this . commandFactory . createExceptionResponse ( id , ResponseStatus . SERVER_THREADPOOL_BUSY ) ; // RejectedExecutionException here assures no response has been sent back // Other exceptions should be processed where exception was caught, because here we don't known whether ack had been sent back. ctx . getChannelContext ( ) . writeAndFlush ( response ) . addListener ( new ChannelFutureListener ( ) { @ Override public void operationComplete ( ChannelFuture future ) throws Exception { if ( future . isSuccess ( ) ) { if ( logger . isInfoEnabled ( ) ) { logger . info ( "Write back exception response done, requestId={}, status={}" , id , response . getResponseStatus ( ) ) ; } } else { logger . error ( "Write back exception response failed, requestId={}" , id , future . cause ( ) ) ; } } } ) ; } } } }
/*
Return error command if necessary.
/ * Return error command if necessary .