static create(broker, endpoint, params, opts = {}) {
		const ctx = new broker.ContextFactory(broker, endpoint);

		if (endpoint != null) ctx.setEndpoint(endpoint);

		if (params != null) {
			let cloning = broker ? broker.options.contextParamsCloning : false;
			if (opts.paramsCloning != null) cloning = opts.paramsCloning;
			ctx.setParams(params, cloning);
		}

		//Object.assign(ctx.options, opts);
		ctx.options = opts;

		// RequestID
		if (opts.requestID != null) ctx.requestID = opts.requestID;
		else if (opts.parentCtx != null && opts.parentCtx.requestID != null)
			ctx.requestID = opts.parentCtx.requestID;

		// Meta
		if (opts.parentCtx != null && opts.parentCtx.meta != null)
			ctx.meta = Object.assign({}, opts.parentCtx.meta || {}, opts.meta || {});
		else if (opts.meta != null) ctx.meta = opts.meta;

		// ParentID, Level, Caller, Tracing
		if (opts.parentCtx != null) {
			ctx.tracing = opts.parentCtx.tracing;
			ctx.level = opts.parentCtx.level + 1;

			if (opts.parentCtx.span) ctx.parentID = opts.parentCtx.span.id;
			else ctx.parentID = opts.parentCtx.id;

			if (opts.parentCtx.service) ctx.caller = opts.parentCtx.service.fullName;
		}

		// caller
		if (opts.caller) {
			ctx.caller = opts.caller;
		}

		// Parent span
		if (opts.parentSpan != null) {
			ctx.parentID = opts.parentSpan.id;
			ctx.requestID = opts.parentSpan.traceID;
			ctx.tracing = opts.parentSpan.sampled;
		}

		// Event acknowledgement
		if (opts.needAck) {
			ctx.needAck = opts.needAck;
		}

		return ctx;
	}
Create a new Context instance

@param {ServiceBroker} broker
@param {Endpoint} endpoint
@param {Object?} params
@param {Object} opts
@returns {Context}

@static
@memberof Context