Jak zrobić funkcję obsługi timeout w komunikacji SOAP?

0

Mam projekt w ramach którego wykonywany jest szereg czynności, wśród których jest też komunikacja za pomocą SOAPa.

Niestety raz na jakiś czas (co 200-250 uruchomień - 12 dziennie) aplikacja ... zawisa. Log operacji generowany przez aplikację pokazuje, że się prawidłowo uruchomiła, że wykonała ileś operacji cyklicznych i w pewnym momencie freeze. Widać, że część procesy przeszła, a reszta ... program stoi.

Szukając przyczyny dobrnąłem do miejsca, gdzie stwierdzam, że musi się coś dziać na etapie komunikacji z usługą udostępnioną poprzez SOAP.

W moim przypadku kluczowym jest, aby proces, który ma się odbyć dobiegł do końca - nawet jeżeli któreś pozycje z całego procesu zostaną pominięte.

Po tym przydługawym wstępie: Do komunikacji po SOAP używam komponentu THTTPRIO (D XE2). Zapytanie wywołuję po prostu: HTTPRIO1.HTTPWebNode.Execute(<pytanie>,<odpowiedź>). Pomyślałem sobie, że najfajniej w moim przypadku będzie po prostu zrobić coś, co wykona Execute, poczeka np. 2-3 sekundy i jeżeli się nie wykona - oleje Execute i przejdzie do kolejnej pozycji/etapu procesu.

Zablokowałem się, bo jeżeli użyłbym TTimer - to przecież nie ma możliwości, żeby przerwał działanie innej procedury w miejscu wywołania Execute i podjął dalsze działanie od następnej instrukcji.

Kurcze ... nie wiem czy ja to dostatecznie jasno tłumaczę.

0

wydaje mi się, że powinieneś rozważyć możliwość skorzystania z wątków, gdyż TTimer raczej wykonywany jest w wątku głównym.
może na sztywno założyłeś dostęp do internetu i jesteś pewny jakości połączenia?
może po stronie serwera lub klienta są przerwy w połączeniu ew. spowolnienia transmisji (z nienacka kotoś postawił kolejne WiFi pracujące na Twoim porcie). Już się nie uzewnętrzniam, bo mi uczeni Koledzy i Koleżanki powiedzą, że spamuję :)

1

A w ogóle próbowałeś ustawić jak niżej:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
const
  TIME_OUT = 10000; //time out w ms (10000 ms = 10 sekund)
begin
  HTTPRIO1.HTTPWebNode.ConnectTimeout:= TIME_OUT;
  HTTPRIO1.HTTPWebNode.SendTimeout:= TIME_OUT;
  HTTPRIO1.HTTPWebNode.ReceiveTimeout:= TIME_OUT;
end;
0
kAzek napisał(a):

A w ogóle próbowałeś ustawić jak niżej:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
const
  TIME_OUT = 10000; //time out w ms (10000 ms = 10 sekund)
begin
  HTTPRIO1.HTTPWebNode.ConnectTimeout:= TIME_OUT;
  HTTPRIO1.HTTPWebNode.SendTimeout:= TIME_OUT;
  HTTPRIO1.HTTPWebNode.ReceiveTimeout:= TIME_OUT;
end;

A widzisz nie ... bo gdybym wiedział, że da się to ustawić (wiem, wiem ... RTFM) nie zadawałbym głupich pytań.

1 użytkowników online, w tym zalogowanych: 0, gości: 1