2016-04-13 7 views
1

Ich mache einen Integrationstest, bei dem ich eine POST-Anforderung aufruft, die eine Datei an den Server sendet. Direkt nach dem POST rufe ich eine GET-Anforderung auf, die das Dokument abruft und eine Antwort erhält, die mir die Attribute dieses Dokuments angibt. Allerdings würde ich manchmal einen Fehler 404 erhalten, der besagt, dass das Dokument nicht existiert, bis ich es ein paar Sekunden später erneut ausführen werde.Warten, bis POST die Verarbeitung beendet, bevor GET-Request aufgerufen wird

Ich denke, der POST ist noch nicht fertig mit der Verarbeitung, also habe ich ein Thread.sleep zu 10 Sekunden warten, aber dieser Weg scheint nicht gut, da es länger warten könnte, als es braucht oder nicht lange genug warten. Gibt es eine Art "implizite Wartezeit", die es dem POST ermöglicht, die Verarbeitung zu beenden, bevor das GET angefordert wird?

Unten finden Sie einen Code-Schnipsel:

@Test 
public void PostDocumentThenCheckIfDocumentExistThenRemove() throws IOException, InterruptedException {  
    try { 
     String str = fileToStringProcessing("C:/Users/Linh/Desktop/file.xml"); 
     ResponseEntity<Message> postResponse = getRestTemplate().exchange(getUri() + "documents", HttpMethod.POST, new HttpEntity(str, getHeaders()), Message.class); 
     Thread.sleep(10000); 
     ResponseEntity<Account> getResponse = getRestTemplate().exchange(getUri() + "account/7452616052/documents?start=2015-01-01&end=2016-03-31", HttpMethod.GET, getHttpEntity(), Account.class); 
     ResponseEntity<Message> deleteResponse = getRestTemplate().exchange(getUri() + "documents/file.xml", HttpMethod.DELETE, getHttpEntity(), Message.class); 

     assertThat(postResponse.getStatusCode(), is(HttpStatus.CREATED)); 
     assertThat(getResponse.getStatusCode(), is(HttpStatus.OK)); 
     assertThat(deleteResponse.getStatusCode(), is(HttpStatus.OK)); 
    }catch(HttpClientErrorException e) { 
     fail("Error! Status code " + e.getStatusCode()); 
    } 
} 

Hier sind die 404-Fehler in der Konsole. Sie können sehen, dass der POST erfolgreich ist, aber nicht der GET. eine GET danach, nach ein paar Sekunden zu tun, wird eine erfolgreiche

11:56:32.700 [main] DEBUG o.s.web.client.RestTemplate - POST request for "https://dpdev.billing.com/tf/dp/documents" resulted in 201 (Created) 
11:56:32.700 [main] DEBUG o.s.web.client.RestTemplate - Reading [com.digitalplatform.model.Message] as "application/xml" using [org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConver[email protected]] 
11:56:32.904 [main] DEBUG o.s.web.client.RestTemplate - Created GET request for "https://dpdev.billing.com/tf/dp/account/7452616052/documents?start=2015-01-01&end=2016-03-31" 
11:56:32.914 [main] DEBUG o.s.web.client.RestTemplate - Setting request Accept header to [application/xml, text/xml, application/json, application/*+xml, application/*+json] 
11:56:33.690 [main] DEBUG o.s.web.client.RestTemplate - GET request for "https://dpdev.billing.com/tf/dp/account/7452616052/documents?start=2015-01-01&end=2016-03-31" resulted in 404 (Not Found); invoking error handler 

GET zeigen und DELETE Anfrage direkt nach dem 404:

12:00:21.383 [main] DEBUG o.s.web.client.RestTemplate - Created GET request for "https://dpdev.billing.com/tf/dp/account/7452616052/documents?start=2015-01-01&end=2016-03-31" 
12:00:21.444 [main] DEBUG o.s.web.client.RestTemplate - Setting request Accept header to [application/xml, text/xml, application/json, application/*+xml, application/*+json] 
12:00:23.176 [main] DEBUG o.s.web.client.RestTemplate - GET request for "https://dpdev.billing.com/tf/dp/account/7452616052/documents?start=2015-01-01&end=2016-03-31" resulted in 200 (OK) 
12:00:23.176 [main] DEBUG o.s.web.client.RestTemplate - Reading [com.digitalplatform.model.Account] as "application/xml" using [org.springfr[email protected]37271612] 
12:00:23.380 [main] DEBUG o.s.web.client.RestTemplate - Created DELETE request for "https://dpdev.billing.com/tf/dp/documents/file.xml" 
12:00:23.381 [main] DEBUG o.s.web.client.RestTemplate - Setting request Accept header to [application/xml, text/xml, application/json, application/*+xml, application/*+json] 
12:00:25.120 [main] DEBUG o.s.web.client.RestTemplate - DELETE request for "https://dpdev.billing.com/tf/dp/documents/file.xml" resulted in 200 (OK) 
12:00:25.120 [main] DEBUG o.s.web.client.RestTemplate - Reading [com.digitalplatform.model.Message] as "application/xml" using [org.springfr[email protected]37271612] 

Antwort

0

der REST-Service asynchron Empfang der Anforderung. Wenn nicht, dann sollte das Dokument verfügbar sein, wenn Sie die nächste GET-Anfrage absetzen. Der HTTP-Thread blockiert, bis Sie eine Antwort für den POST erhalten. Wahrscheinlich gibt der POST einen Fehlercode zurück. Überprüfen Sie den Statuscode zuerst aus der postResponse, bevor Sie einen get ausstellen.

String str = fileToStringProcessing("C:/Users/Linh/Desktop/file.xml"); 
    ResponseEntity<Message> postResponse = getRestTemplate().exchange(getUri() + "documents", HttpMethod.POST, new HttpEntity(str, getHeaders()), Message.class); 
    if(postResponse.getStatusCode() == HttpStatus.OK){ or other success code 
     ResponseEntity<Account> getResponse = getRestTemplate().exchange(getUri() + "account/7452616052/documents?start=2015-01-01&end=2016-03-31", HttpMethod.GET, getHttpEntity(), Account.class); 
     ResponseEntity<Message> deleteResponse = getRestTemplate().exchange(getUri() + "documents/2015067452616054", HttpMethod.DELETE, getHttpEntity(), Message.class); 
    } 
    else{ 
     //process error response 
    } 
+0

Aktualisierte Frage mit vollem Code. Wahrscheinlich hätte er die ganze Methode aufstellen sollen. Beim POST bekomme ich einen 200 OK-Status, so dass der POST definitiv erfolgreich ist. Wird auch später mit den Konsoleninformationen aktualisiert – LinhSaysHi

Verwandte Themen