class AsyncUtil {
    private static final int DEFAULT_ASYNC_TIMEOUT = 1000; // This variable has no practical meaning on the server side, because the server side does not use Future's getValue method to block waiting for results.
    private static ThreadPoolExecutor defaultCallbackExecutor = new StandardThreadExecutor(20, 200,
            DEFAULT_MAX_IDLE_TIME, MILLISECONDS, 5000,
            new DefaultThreadFactory("defaultResponseCallbackPool-", true), new ThreadPoolExecutor.DiscardPolicy());

    public static synchronized void setDefaultCallbackExecutor(ThreadPoolExecutor defaultCallbackExecutor) {
        if (defaultCallbackExecutor == null) {
            throw new MotanFrameworkException("defaultCallbackExecutor cannot be null");
        }
        ThreadPoolExecutor temp = AsyncUtil.defaultCallbackExecutor;
        AsyncUtil.defaultCallbackExecutor = defaultCallbackExecutor;
        temp.shutdown();
    }

    public static ThreadPoolExecutor getDefaultCallbackExecutor() {
        return defaultCallbackExecutor;
    }

    public static ResponseFuture createResponseFutureForServerEnd() {<FILL_FUNCTION_BODY>}
}

        Request request = RpcContext.getContext().getRequest();
        if (request == null) {
            throw new MotanFrameworkException("can not get request from RpcContext");
        }
        return new DefaultResponseFuture(request, DEFAULT_ASYNC_TIMEOUT, request.getAttachment(URLParamType.host.getName()));
    
<no_super_class>