簡體   English   中英

Spring 同時請求多個

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM