Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
URČENO PRO: SDK v4
Middleware je jednoduše třída, která se nachází mezi adaptérem a logikou robota, která se během inicializace přidá do kolekce middlewaru adaptéru. Sada SDK umožňuje psát vlastní middleware nebo přidávat middleware vytvořený někým jiným. Přes middleware procházejí všechny příchozí i odchozí aktivity robota.
Adaptér zpracovává a směruje příchozí aktivity prostřednictvím kanálu middlewaru robota do logiky robota a pak se zase vrátí zpět. Když jednotlivé aktivity přicházejí do robota a odcházejí z něj ven, všechny části middlewaru můžou aktivity zkoumat nebo na ně reagovat před spuštěním i po spuštění logiky robota.
Než se pustíte do middlewaru, je důležité porozumět robotům obecně a tomu, jak zpracovávají aktivity.
Používá se pro middleware
Často se vyskytuje otázka: „Kdy mám implementovat akce jako middleware oproti použití běžné logiky bota?“ Middleware poskytuje další příležitosti pro interakci s průběhem konverzace s uživateli před a po každém kole konverzace. Middleware také umožňuje ukládat a načítat informace týkající se konverzace a v případě potřeby volat další logiku zpracování. Níže jsou uvedeny některé běžné scénáře, které ukazují, kde může být middleware užitečný.
Zkoumání a jednání na každou aktivitu
Existuje spousta situací, které vyžadují, aby robot něco udělal pro každou aktivitu nebo pro každou aktivitu určitého typu. Můžete například chtít protokolovat každou aktivitu zpráv, kterou robot obdrží, nebo poskytnout náhradní odpověď, pokud robot jinak nevygeneroval odpověď v tomto kole. Middleware je skvělým místem pro takové procesy s možností jednat před i po spuštění logiky robota.
Úprava nebo vylepšení kontextu otáčení
Některé konverzace můžou být mnohem plodnější, pokud robot má více informací, než co je v aktivitě poskytováno. Middleware by se v tomto případě mohlo podívat na informace o stavu konverzace, které zatím obsahuje, dotazovat externí zdroj dat a připojit tato data k objektu kontextu turn než předá řízení logice bota.
Sada SDK definuje protokolovací mezivrstvu, která může zaznamenávat příchozí a odchozí aktivity, ale vlastní mezivrstvu můžete také definovat sami.
Kanál middlewaru robota
Pro každou aktivitu adaptér volá middleware v pořadí, ve kterém jste ho přidali. Adaptér předává kontextový objekt pro daný krok a delegáta next, a middleware zavolá tohoto delegáta, aby předal řízení dalšímu middlewaru v kanálu. Middleware má také možnost dělat věci po návratu dalšího delegáta před dokončením metody. Můžete si to představit tak, že každý middlewareový objekt má první a poslední šanci jednat s ohledem na objekty middleware, které ho následují v potrubí.
Například:
- Před voláním dalšího volání spustí obslužná rutina prvního middlewarového objektu kód.
- Druhá obslužná rutina objektu middlewaru spustí kód před voláním dalšího objektu.
- Obslužná rutina pro bota se spustí a dokončí se.
- Druhá obslužná rutina objektu middlewaru před vrácením spustí veškerý zbývající kód.
- Druhá obslužná rutina objektu middlewaru spustí kód před voláním dalšího objektu.
- První obslužná rutina objektu middlewaru nejprve spustí veškerý zbývající kód, než se vrátí.
Pokud middleware nezavolá dalšího delegáta, adaptér nezavolá žádný z následných middlewarů ani obslužných rutin otočení robota a tok dat se předčasně ukončí.
Jakmile se dokončí zpracování middlewarové fronty robota, kolo se ukončí a kontext se vymkne rozsahu.
Middleware nebo bot může generovat odpovědi a registrovat obslužné rutiny událostí pro odpovědi, ale mějte na paměti, že odpovědi se zpracovávají v samostatných procesech.
Pořadí middlewaru
Vzhledem k tomu, že pořadí, ve kterém se přidává middleware, určuje pořadí, ve kterém middleware zpracovává aktivitu, je důležité rozhodnout o sekvenci, kterou má být přidán middleware.
Poznámka:
To vám dává běžný vzor, který funguje pro většinu robotů, ale nezapomeňte zvážit, jak jednotlivé části middlewaru budou komunikovat s ostatními pro vaši situaci.
Middleware, které se stará o úlohy na nejnižší úrovni, které by měly být přidány do middleware pro každý bot jako první v sekvenci. Mezi příklady patří protokolování, zpracování výjimek a překlad. Pořadí těchto procesů závisí na vašich potřebách, například zda chcete, aby se příchozí zpráva nejprve přeložila před ukládáním zpráv, nebo zda by se zprávy měly nejprve uložit, což by znamenalo, že uložené zprávy nebudou přeloženy.
Middleware specifický pro robota by se měl přidat do vašeho kanálu middlewaru jako poslední, middleware, který implementujete pro zpracování každé zprávy odeslané robotovi. Pokud váš middleware používá informace o stavu nebo jiné informace nastavené v kontextu robota, přidejte ho do kanálu middlewaru za middleware, který upravuje stav nebo kontext.
Zkratování
Důležitým nápadem kolem middlewaru a obslužných rutin odpovědí je zkratové obvody. Pokud má provádění pokračovat ve vrstvách, které jej následují, je potřeba, aby middleware (nebo obslužná rutina odpovědi) předal provádění pomocí volání svého delegáta next. Pokud další delegát není volán v rámci daného middlewaru (nebo obslužné rutiny odpovědi), přidružený kanál se zkrátí a následující vrstvy se nespustí. To znamená, že se přeskočí veškerá logika robota a veškerý middleware ve zbývajících částech procesu. Mezi vaším middlewarem a vaším obslužným modulem odezvy, který přerušuje průběh procesu, je jemný rozdíl.
Když middleware přeruší průběh, obslužná metoda robota nebude zavolána, ale veškerý kód middlewaru spuštěný před tímto bodem v rámci kanálu se stále spustí až do konce.
Pro obslužné rutiny událostí, nevolání další znamená, že událost je zrušena, což se velmi liší od logiky přeskakování middlewaru. Tím, že nezpracovává zbytek události, adaptér ji nikdy neodesílá.
Návod
Pokud zkratujete událost odezvy, například SendActivities
, ujistěte se, že se jedná o chování, které máte v úmyslu. V opačném případě může být obtížné opravit chyby.
Obslužné rutiny událostí odpovědi
Kromě logiky aplikace a middlewaru je možné do kontextového objektu přidat obslužné rutiny odpovědí (někdy označované také jako obslužné rutiny událostí nebo obslužné rutiny událostí aktivity). Tyto obslužné rutiny se volají, když dojde k přidružené odpovědi u aktuálního kontextového objektu, před spuštěním skutečné odpovědi. Tyto obslužné rutiny jsou užitečné, když víte, že budete potřebovat něco udělat, a to buď před samotnou událostí nebo po ní, pro každou aktivitu tohoto typu po zbytek dané reakce.
Výstraha
Dávejte pozor, abyste nevolali metodu odpovědi aktivity z příslušné obslužné rutiny události odpovědi, například volání metody odesílání aktivity z obslužné rutiny aktivity pro odeslání. Tím se vygeneruje nekonečná smyčka.
Nezapomeňte, že každá nová aktivita získá nové vlákno ke spuštění. Když se vytvoří vlákno pro zpracování aktivity, seznam obslužných rutin pro tuto aktivitu se zkopíruje do tohoto nového vlákna. Po tomto bodu se pro danou konkrétní událost aktivity nespustí žádné obslužné rutiny. Obslužné rutiny zaregistrované v kontextovém objektu se zpracovávají podobně jako adaptér, který spravuje kanál middlewaru. Konkrétně obslužné rutiny se volají v pořadí, ve kterém jsou přidány, a volání dalšího delegáta předá řízení další zaregistrované obslužné rutině události. Pokud obslužná rutina nevolá dalšího delegáta, žádná z následujících obslužných rutin události není vyvolána, událost je zkrácena a adaptér neodešle odpověď do kanálu.
Zpracování stavu v middlewaru
Běžnou metodou uložení stavu je volání metody save changes na konci obslužné rutiny otáčení. Tady je diagram s fokusem na volání.
Problém s tímto přístupem spočívá v tom, že všechny aktualizace stavu prováděné vlastním middlewarem, ke kterým dochází po vrácení točny robota, se neuloží do odolného úložiště. Řešením je přesunout volání metody save changes po dokončení vlastního middlewaru přidáním instance middlewaru automatického ukládání změn na začátek zásobníku middlewaru nebo alespoň před jakýmkoli middlewarem, který by mohl aktualizovat stav. Spuštění je znázorněno níže.
Přidejte objekty správy stavu, které budou potřebovat aktualizaci na objekt sady stavů robota , a pak je použijte při vytváření middlewaru pro automatické ukládání změn.
Dodatečné zdroje
Můžete se podívat na middleware transkripčního zapisovače, který je implementovaný v sadě Bot Framework SDK [C# | JS].