class RpcAsyncContext implements AsyncContext {
    /** remoting context */
    private RemotingContext     ctx;

    /** rpc request command */
    private RpcRequestCommand   cmd;

    private RpcRequestProcessor processor;

    /** is response sent already */
    private AtomicBoolean       isResponseSentAlready = new AtomicBoolean();

    /**
     * Default constructor.
     *
     * @param ctx remoting context
     * @param cmd rpc request command
     * @param processor rpc request processor
     */
    public RpcAsyncContext(final RemotingContext ctx, final RpcRequestCommand cmd,
                           final RpcRequestProcessor processor) {
        this.ctx = ctx;
        this.cmd = cmd;
        this.processor = processor;
    }

    /**
     * @see com.alipay.remoting.AsyncContext#sendResponse(java.lang.Object)
     */
    @Override
    public void sendResponse(Object responseObject) {<FILL_FUNCTION_BODY>}

    /**
     * @see com.alipay.remoting.AsyncContext#sendException(java.lang.Throwable)
     */
    @Override
    public void sendException(Throwable ex) {
        if (isResponseSentAlready.compareAndSet(false, true)) {
            processor.sendResponseIfNecessary(
                this.ctx,
                cmd.getType(),
                processor.getCommandFactory().createExceptionResponse(this.cmd.getId(),
                    ResponseStatus.SERVER_EXCEPTION, ex));
        } else {
            throw new IllegalStateException("Should not send rpc response repeatedly!");
        }
    }
}

        if (isResponseSentAlready.compareAndSet(false, true)) {
            processor.sendResponseIfNecessary(this.ctx, cmd.getType(), processor
                .getCommandFactory().createResponse(responseObject, this.cmd));
        } else {
            throw new IllegalStateException("Should not send rpc response repeatedly!");
        }
    
<no_super_class>