Autor | Zpráva | ||
---|---|---|---|
Musilda Profil |
#1 · Zasláno: 12. 10. 2018, 08:31:37
Dobrý den,
mám otázku na to, jak postupovat, pokud chci určitou akci provést pouze jednou. Problém: Na určité url přijmu notifikaci z externí služby, na základě které volám statickou metodu třídy, která odešle na jinou url druhé externí služby určitá data. Problém nastává v tu chvíli, kdy ta první služba je schopna zavolat tu url dvakrát za sebou a protože proces odeslání dat na druhou službu ještě není u konce a není v databázi uložena informace, že již došlo k odeslání, odešlou se data podruhé. Otázka: Je možné upravit třídu tak, aby se nedal vytvořit souběžný požadavek? Budou mi stačit i odkazy na nějaké články, jen jsem nevěděl, jak se na to Google zeptat. |
||
juriad Profil |
#2 · Zasláno: 12. 10. 2018, 08:47:27
Musilda:
Ulož si do databáze, že se požadavek vyřizuje a případně i datum a čas. Před prvním požadavkem: je db prázdná Po přijetí prvního požadavku: přidat záznam: ID, SENDING, 2018-10-11 8:41:00.105 Po přijetí druhého požadavku: vyhledat ID v db (a zamítnout) Po vyhodnocení prvního požadavku: změnit záznam na: ID, PROCESSED, 2018-10-11 8:41:00.367 Ten čas si tam ukládáš proto, že kydby čas < now() - 10 minutes , tak chceš požadavek zopakovat (například).
Alternativou by bylo před odesláním: LOCK TABLE tabulka WRITE , pak zapsat výsledek zpracování a následně: UNLOCK TABLES .
Databáze se postará, že jen jeden klient/požadavek může držet zámek k tabulce. Nevýhodou je, že neumožníš zpracování více různých požadavků zároveň. |
||
Časová prodleva: 6 let
|
0