@Override public List<MethodMetadata> parseAndValidatateMetadata(Class<?> targetType) { List<MethodMetadata> metadatas = delegate.parseAndValidatateMetadata(targetType); metadatas.forEach(metadata -> metadataMap .put(targetType.getName() + metadata.configKey(), metadata)); return metadatas; }
/** * Logs retry. */ private void logRetry() { if (logLevel != Logger.Level.NONE) { logger.logRetry(metadata.configKey(), logLevel); } }
public RetryReactiveHttpClient(ReactiveHttpClient reactiveClient, MethodMetadata methodMetadata, Function<Flux<Throwable>, Publisher<Throwable>> retryFunction) { this.reactiveClient = reactiveClient; this.feignMethodTag = methodMetadata.configKey().substring(0, methodMetadata.configKey().indexOf('(')); this.retryFunction = wrapWithLog(retryFunction, feignMethodTag); final Type returnType = methodMetadata.returnType(); returnPublisherType = ((ParameterizedType) returnType).getRawType(); }
@Override public List<MethodMetadata> parseAndValidatateMetadata(Class<?> targetType) { List<MethodMetadata> metadatas = delegate.parseAndValidatateMetadata(targetType); metadatas.forEach(metadata -> metadataMap .put(targetType.getName() + metadata.configKey(), metadata)); return metadatas; }
/** * Logs IO exception. * * @param exception IO exception * @param elapsedTime time spent to execute request */ private void logIoException(final IOException exception, final long elapsedTime) { if (logLevel != Logger.Level.NONE) { logger.logIOException(metadata.configKey(), logLevel, exception, elapsedTime); } }
/** * Logs request. * * @param request HTTP request */ private void logRequest(final Request request) { if (logLevel != Logger.Level.NONE) { logger.logRequest(metadata.configKey(), logLevel, request); } }
@Override public List<MethodMetadata> parseAndValidatateMetadata(final Class<?> targetType) { final List<MethodMetadata> methodsMetadata = this.delegate.parseAndValidatateMetadata(targetType); for (final MethodMetadata metadata : methodsMetadata) { final Type type = metadata.returnType(); if (!isRx2Type(type)) { throw new IllegalArgumentException(String.format( "Method %s of contract %s doesn't returns rx2 types", metadata.configKey(), targetType.getSimpleName())); } } return methodsMetadata; }
Map<String, MethodHandler> apply(final Target target) { final List<MethodMetadata> metadata = contract .parseAndValidatateMetadata(target.type()); final Map<String, MethodHandler> result = new LinkedHashMap<>(); for (final MethodMetadata md : metadata) { ReactiveMethodHandler methodHandler = factory.create(target, md); result.put(md.configKey(), methodHandler); } return result; } }
@Override public List<MethodMetadata> parseAndValidatateMetadata(final Class<?> targetType) { final List<MethodMetadata> metadatas = this.delegate .parseAndValidatateMetadata(targetType); for (final MethodMetadata metadata : metadatas) { final Type type = metadata.returnType(); if (!isMonoOrFlux(type)) { throw new IllegalArgumentException(String.format( "Method %s of contract %s doesn't returns reactor.core.publisher.Mono or reactor.core.publisher.Flux", metadata.configKey(), targetType.getSimpleName())); } } return metadatas; }
@Override public final List<MethodMetadata> parseAndValidatateMetadata(Class<?> targetType) { List<MethodMetadata> mdList = delegate.parseAndValidatateMetadata(targetType); Map<String, MethodMetadata> methodMetadataByConfigKey = new LinkedHashMap<String, MethodMetadata>(); for (MethodMetadata md : mdList) { methodMetadataByConfigKey.put(md.configKey(), md); } for (Method method : targetType.getMethods()) { if (method.getDeclaringClass() == Object.class) { continue; } String configKey = Feign.configKey(targetType, method); MethodMetadata metadata = methodMetadataByConfigKey.get(configKey); if (metadata != null) { processMetadata(targetType, method, metadata); } } return mdList; }
@Override public final List<MethodMetadata> parseAndValidatateMetadata(Class<?> targetType) { List<MethodMetadata> mdList = delegate.parseAndValidatateMetadata(targetType); Map<String, MethodMetadata> methodMetadataByConfigKey = new LinkedHashMap<String, MethodMetadata>(); for (MethodMetadata md : mdList) { methodMetadataByConfigKey.put(md.configKey(), md); } for (Method method : targetType.getMethods()) { if (method.getDeclaringClass() == Object.class) { continue; } String configKey = Feign.configKey(targetType, method); MethodMetadata metadata = methodMetadataByConfigKey.get(configKey); if (metadata != null) { processMetadata(targetType, method, metadata); } } return mdList; }
public WebReactiveHttpClient(MethodMetadata methodMetadata, WebClient webClient, ReactiveHttpRequestInterceptor requestInterceptor, ReactiveStatusHandler statusHandler, boolean decode404) { this.webClient = webClient; this.metadata = methodMetadata; this.requestInterceptor = requestInterceptor; this.statusHandler = statusHandler; this.decode404 = decode404; this.logger = new Logger(); this.methodTag = methodMetadata.configKey().substring(0, methodMetadata.configKey().indexOf('(')); Type bodyType = methodMetadata.bodyType(); bodyActualType = getBodyActualType(bodyType); final Type returnType = methodMetadata.returnType(); returnPublisherType = ((ParameterizedType) returnType).getRawType(); returnActualType = ParameterizedTypeReference.forType( resolveLastTypeParameter(returnType, (Class<?>) returnPublisherType)); }
private HystrixMethodHandler( Target target, MethodMetadata methodMetadata, ReactiveMethodHandler methodHandler, CloudReactiveFeign.SetterFactory setterFactory, @Nullable Function<Throwable, Object> fallbackFactory) { checkNotNull(target, "target must be not null"); checkNotNull(methodMetadata, "methodMetadata must be not null"); method = Arrays.stream(target.type().getMethods()) .filter(method -> configKey(target.type(), method).equals(methodMetadata.configKey())) .findFirst().orElseThrow(() -> new IllegalArgumentException()); method.setAccessible(true); returnPublisherType = ((ParameterizedType) methodMetadata.returnType()).getRawType(); this.methodHandler = checkNotNull(methodHandler, "methodHandler must be not null"); this.fallbackFactory = fallbackFactory; checkNotNull(setterFactory, "setterFactory must be not null"); hystrixObservableCommandSetter = setterFactory.create(target, methodMetadata); }
HystrixMethodHandler( Target target, MethodMetadata methodMetadata, MethodHandler methodHandler, CloudReactiveFeign.SetterFactory setterFactory, @Nullable Function<Throwable, Object> fallbackFactory) { checkNotNull(target, "target must be not null"); checkNotNull(methodMetadata, "methodMetadata must be not null"); method = Arrays.stream(target.type().getMethods()) .filter(method -> configKey(target.type(), method).equals(methodMetadata.configKey())) .findFirst().orElseThrow(() -> new IllegalArgumentException()); method.setAccessible(true); returnPublisherType = ((ParameterizedType) methodMetadata.returnType()).getRawType(); this.methodHandler = checkNotNull(methodHandler, "methodHandler must be not null"); this.fallbackFactory = fallbackFactory; checkNotNull(setterFactory, "setterFactory must be not null"); hystrixObservableCommandSetter = setterFactory.create(target, methodMetadata); }
@Override public HystrixObservableCommand.Setter create(Target<?> target, MethodMetadata methodMetadata) { String groupKey = target.name(); String commandKey = methodMetadata.configKey(); return HystrixObservableCommand.Setter .withGroupKey(HystrixCommandGroupKey.Factory.asKey(groupKey)) .andCommandKey(HystrixCommandKey.Factory.asKey(commandKey)); } }
@Override public HystrixObservableCommand.Setter create(Target<?> target, MethodMetadata methodMetadata) { String groupKey = target.name(); String commandKey = methodMetadata.configKey(); return HystrixObservableCommand.Setter .withGroupKey(HystrixCommandGroupKey.Factory.asKey(groupKey)) .andCommandKey(HystrixCommandKey.Factory.asKey(commandKey)); } }
@Override public HystrixObservableCommand.Setter create(Target<?> target, MethodMetadata methodMetadata) { String groupKey = target.name(); String commandKey = methodMetadata.configKey(); return HystrixObservableCommand.Setter .withGroupKey(HystrixCommandGroupKey.Factory.asKey(groupKey)) .andCommandKey(HystrixCommandKey.Factory.asKey(commandKey)); } }
public Map<String, MethodHandler> apply(Target key) { List<MethodMetadata> metadata = contract.parseAndValidatateMetadata(key.type()); Map<String, MethodHandler> result = new LinkedHashMap<String, MethodHandler>(); for (MethodMetadata md : metadata) { BuildTemplateByResolvingArgs buildTemplate; if (!md.formParams().isEmpty() && md.template().bodyTemplate() == null) { buildTemplate = new BuildFormEncodedTemplateFromArgs(md, encoder); } else if (md.bodyIndex() != null) { buildTemplate = new BuildEncodedTemplateFromArgs(md, encoder); } else { buildTemplate = new BuildTemplateByResolvingArgs(md); } result.put(md.configKey(), factory.create(key, md, buildTemplate, options, decoder, errorDecoder)); } return result; } }
@Override public Object invoke(Object[] argv) throws Throwable { RequestTemplate template = buildTemplateFromArgs.create(argv); Retryer retryer = this.retryer.clone(); while (true) { try { return executeAndDecode(template); } catch (RetryableException e) { retryer.continueOrPropagate(e); if (logLevel != Logger.Level.NONE) { logger.logRetry(metadata.configKey(), logLevel); } continue; } } }