[英]Spring multiple requests simultaneously
這是在收到 db 中的帖子列表后發送帶有每個帖子鏈接數據的 POST 請求的代碼。
在使用每個鏈接請求 POST 后,從響應中提取 playerCount 並將其更新到每個帖子。
我在這段代碼中使用了Resttemplate,但是有一個問題耗時太長。
所以我想將此代碼更改為立即發送請求並在所有請求完成后更新每個帖子。
我怎樣才能將這段代碼轉換成我想要的?
我打算將此代碼用作計划任務。
@Test
@Transactional
@Rollback(false)
public void postToGraphql2() throws JsonProcessingException, JSONException {
String URL = "https://gt-space-data.herokuapp.com/graphql";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("content-type", "application/json");
long startTime = System.currentTimeMillis();
List<Posts> list = postsRepository.findPostsByCategoryStringContaining("GATHERTOWN");
String query = "query gameData($apikey:String!,$spaceid:String!,$spacename:String!){gameData(spaceData:{apiKey: $apikey, spaceIdNum: $spaceid, spaceName: $spacename}){playerCount,}}";
String opertationName = "gameData";
list.forEach(posts -> {
String link = posts.getLink();
if(link.contains("gather.town")){
String spaceid = link.substring(link.indexOf("app/")+4,link.lastIndexOf("/"));
String spacename = link.substring(link.lastIndexOf("/")+1, link.length());
String variables = "{\"apikey\": \"QUNCVEQGILsqe5\",\"spaceid\": \""+spaceid+"\",\"spacename\" : \""+spacename+"\"}";
try {
ResponseEntity<PlayerCountDto> response =
restTemplate.postForEntity(URL, new HttpEntity<>(createJsonQueries(query,opertationName,variables), headers), PlayerCountDto.class);
int playerCount = Objects.requireNonNull(response.getBody()).getData().getGameData().playerCount;
posts.setPlayerCount(playerCount);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
});
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println(elapsedTime);
}
一種方法是將 Resttemplate 替換為“Webclient”。 Webclient是Spring 5.0中引入的Spring Webflux的一部分。 Webclient 是異步和非阻塞的。
您可以從以下文檔開始
https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/html/boot-features-webclient.html
我將我的代碼 Resttemplate 更改為 webclient 但在使用 subscribe() 時不工作。
使用 .block() 時效果很好,但耗時太長。
我如何 get.subscribe() 工作?
@Test
@Transactional
@Rollback(false)
public void postToGraphql3() throws JsonProcessingException, JSONException {
String URL = "https://gt-space-data.herokuapp.com/graphql";
WebClient webClient = webClientBuilder.baseUrl(URL).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).build();
long startTime = System.currentTimeMillis();
List<Posts> list = postsRepository.findPostsByCategoryStringContaining("GATHERTOWN");
String query = "query gameData($apikey:String!,$spaceid:String!,$spacename:String!){gameData(spaceData:{apiKey: $apikey, spaceIdNum: $spaceid, spaceName: $spacename}){playerCount,}}";
String opertationName = "gameData";
list.forEach(posts -> {
String link = posts.getLink();
String graphqlQuery = null;
if(link.contains("gather.town")){
String spaceid = link.substring(link.indexOf("app/")+4,link.lastIndexOf("/"));
String spacename = link.substring(link.lastIndexOf("/")+1, link.length());
String variables = "{\"apikey\": \"QUNCVEQGILsqeXR5\",\"spaceid\": \""+spaceid+"\",\"spacename\" : \""+spacename+"\"}";
try {
graphqlQuery = createJsonQueries(query,opertationName,variables);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
//not working when using .subscribe()
Mono<PlayerCountDto> playerCountDtoMono = webClient.post().bodyValue(graphqlQuery)
.retrieve()
.bodyToMono(PlayerCountDto.class);
playerCountDtoMono.doOnSuccess(
playerCountDto -> {
System.out.println(playerCountDto.getData().gameData.getPlayerCount());
}
).subscribe();
});
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println(elapsedTime);
}
日志
2022-04-24 12:15:08.101 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.1 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.102 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.1 : | request(unbounded)
2022-04-24 12:15:08.856 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.2 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.856 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.2 : | request(unbounded)
2022-04-24 12:15:08.859 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.3 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.859 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.3 : | request(unbounded)
2022-04-24 12:15:08.861 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.4 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.862 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.4 : | request(unbounded)
2022-04-24 12:15:08.867 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.5 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.867 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.5 : | request(unbounded)
2022-04-24 12:15:08.869 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.6 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.870 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.6 : | request(unbounded)
2022-04-24 12:15:08.872 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.7 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.873 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.7 : | request(unbounded)
2022-04-24 12:15:08.876 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.8 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.877 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.8 : | request(unbounded)
2022-04-24 12:15:08.880 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.9 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.880 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.9 : | request(unbounded)
2022-04-24 12:15:08.882 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.10 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.882 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.10 : | request(unbounded)
2022-04-24 12:15:08.884 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.11 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.884 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.11 : | request(unbounded)
2022-04-24 12:15:08.887 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.12 : | onSubscribe([Fuseable] MonoPeekTerminal.MonoTerminalPeekSubscriber)
2022-04-24 12:15:08.887 INFO 29112 --- [ Test worker] reactor.Mono.PeekTerminal.12 : | request(unbounded)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.