@Override
    public void runContextCustomizer() {
        final Consumer<ClientRequestContext> customizer;
        final Consumer<ClientRequestContext> optionsCustomizer = options.contextCustomizer();
        final Consumer<ClientRequestContext> threadLocalCustomizer = copyThreadLocalCustomizer();
        if (optionsCustomizer == ClientOptions.CONTEXT_CUSTOMIZER.defaultValue()) {
            customizer = threadLocalCustomizer;
        } else if (threadLocalCustomizer == null) {
            customizer = optionsCustomizer;
        } else {
            customizer = optionsCustomizer.andThen(threadLocalCustomizer);
        }
        if (customizer != null) {
            try {
                customizer.accept(this);
            } catch (Throwable t) {
                cancel(UnprocessedRequestException.of(t));
            }
        }
    }
Creates a new instance. Note that {@link #init()} method must be invoked to finish
the construction of this context.

@param sessionProtocol the {@link SessionProtocol} of the invocation
@param id the {@link RequestId} that contains the identifier of the current {@link Request}
          and {@link Response} pair.
@param req the {@link HttpRequest} associated with this context
@param rpcReq the {@link RpcRequest} associated with this context
@param requestStartTimeNanos {@link System#nanoTime()} value when the request started.
@param requestStartTimeMicros the number of microseconds since the epoch,
                              e.g. {@code System.currentTimeMillis() * 1000}.
core/src/main/java/com/linecorp/armeria/internal/client/DefaultClientRequestContext.java