Я использую весеннюю загрузку версии 2.0.0.M6.
Мне нужно сделать асинхронные HTTP-вызовы из приложения весенней загрузки, скажем, APP1, в другое приложение (игровая среда), скажем, APP2.
Поэтому, если мне нужно сделать 20 различных асинхронных вызовов от APP1 к APP2, APP2 получает 20 запросов, из которых несколько являются дубликатами, что означает, что эти дубликаты заменили несколько отдельных запросов.
Ожидаемый:
api/v1/call/1
api/v1/call/2
api/v1/call/3
api/v1/call/4
Фактический:
api/v1/call/1
api/v1/call/2
api/v1/call/4
api/v1/call/4
Я использую пружинный реактивный WebClient.
Ниже приведена весенняя загрузочная версия в build.gradle
buildscript {
ext {
springBootVersion = '2.0.0.M6'
//springBootVersion = '2.0.0.BUILD-SNAPSHOT'
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
maven {url "https://plugins.gradle.org/m2/"}
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("se.transmode.gradle:gradle-docker:1.2")
}
}
Мой фрагмент кода инициализации WebClient
private WebClient webClient = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector((HttpClientOptions.Builder builder) -> builder.disablePool()))
.build();
Мой метод POST
public <T> Mono<JsonNode> postClient(String url, T postData) {
return Mono.subscriberContext().flatMap(ctx -> {
String cookieString = ctx.getOrDefault(Constants.SubscriberContextConstnats.COOKIES, StringUtils.EMPTY);
URI uri = URI.create(url);
return webClient.post().uri(uri).body(BodyInserters.fromObject(postData)).header(HttpHeaders.COOKIE, cookieString)
.exchange().flatMap(clientResponse ->
{
return clientResponse.bodyToMono(JsonNode.class);
})
.onErrorMap(err -> new TurtleException(err.getMessage(), err))
.doOnSuccess(jsonData -> {
});
});
}
Код, из которого вызывается этот метод postClient
private void getResultByKey(PremiumRequestHandler request, String key, BrokerConfig brokerConfig) {
/* Live calls for the insurers */
LOG.info("[PREMIUM SERVICE] LIVE CALLLLL MADE FOR: " + key + " AND REQUEST ID: " + request.getRequestId());
String uri = brokerConfig.getHostUrl() + verticalResolver.determineResultUrl(request.getVertical()) + key;
LOG.info("[PREMIUM SERVICE] LIVE CALL WITH URI : " + uri + " FOR REQUEST ID: " + request.getRequestId());
Mono<PremiumResponse> premiumResponse = reactiveWebClient.postClient(uri, request.getPremiumRequest())
.map(json -> PlatformUtils.mapToClass(json, PremiumResponse.class));
premiumResponse.subscribe(resp -> {
resp.getPremiumResults().forEach(result -> {
LOG.info("Key " + result.getKey());
repository.getResultRepoRawType(request.getVertical())
.save(result).subscribe();
saveResult.subscriberContext(ctx -> {
MultiBrokerMongoDBFactory.setDatabaseNameForCurrentThread(brokerConfig.getBroker());
return ctx;
}).subscribe();
});
}, error -> {
LOG.info("[PREMIUM SERVICE] ERROR RECIEVED FOR " + key + " AND REQUEST ID" + request.getRequestId() + " > " + error.getMessage());
});
}
Положил журналы в конечную точку в коде клиента, не может видеть несколько запросов в этот момент.
Возможно, это ошибка в WebClient, когда URI переставляется в многопоточной среде.
Попробовал мутировавший WebClient, но URI по-прежнему поменялся местами
Пожалуйста, помогите.
Добавлено Git Repo github.com / praveenk007 / ps-demo