Mam sytuacji gdzie mam zadzwonić do zewnętrznego interfejsu API A i wykorzystanie jej odpowiedź karmić się wniosek API B i nazwać, a następnie powrócić do odpowiedzi wywołującego API A. coś takiego jak poniżejJak zablokować wątek, aby czekać na odpowiedź w pliku vert.x?
method(){
response = call API A
}
method_for_API_A(){
handler() ->{
API_B
}
return response;
}
method_for_API_B(){
//code to call API B
}
Co ja Tutaj stoi, że metoda API A zwraca odpowiedź, nie czekając na otrzymanie odpowiedzi z B.
Sprawdziłem metodę executeBlocking w vert.x, a także próbowałem użyć "kolejki blokującej", ale nie mogłem osiągnąć tego, do czego jestem przeznaczony zrobić. Czy ktoś może skierować mnie do prawidłowego sposobu robienia tego. Dzięki za to.
EDIT: Just do wyjaśnienia dokładnego scenariusza
Class MyClass{
public Response method_A (Request request){
String respFromApiA = Call_API_A(request) ; // STEP 1
Response respFromApiB = Call_API_B(request, respFromApiA); // STEP 2
Print(respFromApiB) // PRINT FINAL Response
return respFromApiB; // STEP 3
}
String Call_API_A(Request request){
// Implementation
Print(string); // PRINT API A response
return string
}
Response Call_API_B(Response response){
// Implementation
Print(response); // PRINT API B response
return response;
}
}
Używam vert.x ramy z Java. Teraz, co się dzieje podczas wykonywania, przepływ przychodzi do KROKU 1, zainicjować wywołanie API A. Przechodzi do KROKU 2 (bez czekania na "respFromApiA") i wykonuje wywołanie API B (które nie powiedzie się ostatecznie, ponieważ respFromApiA ma wartość NULL). I na koniec przepływ przechodzi do KROKU 3 i powrót stąd. (bez czekania na wyniki API A i API B). Jeśli widzimy kolejność wydruku będzie to coś takiego
PRINT FINAL Response
PRINT API A response
PRINT API B response
Co staram się osiągnąć?
Wait for API A response.
Make call to API B. Wait for API B response.
Return response got from API B.
Mam nadzieję, że tym razem będę w stanie to wyjaśnić. Proszę dać mi znać, jeśli potrzebujesz dalszych danych wejściowych.
Dlaczego nie można zrobić oba połączenia w "metoda" sekwencyjnie? – Fildor
Zgaduję, że wykonujesz połączenia bez blokowania. Najprawdopodobniej zwracają swoje odpowiedzi w wywołaniu zwrotnym (nie wiem vert.x, przepraszam). Musisz więc znaleźć albo możliwość poinformowania vert.x, że chcesz zablokować te połączenia i zwrócić wynik, albo musisz użyć wywołań zwrotnych. – Fildor
Może gdybyś pokazał więcej kodu (prawdziwy kod), wtedy ktoś z doświadczeniem w vert.x mógłby pomóc ... – Fildor