這是在接收到 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);
}
uj5u.com熱心網友回復:
一種方法是將 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
uj5u.com熱心網友回復:
我將代碼 Resttemplate 更改為 webclient,但在使用 subscribe() 時不起作用。
使用 .block() 時效果很好,但耗時太長。
如何讓 .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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/463675.html
