Mesaje intercepteaza sobjectizer

Ideea că SObjectizer ar fi de dorit să existe un mecanism pentru a intercepta comunicațiile, există o lungă perioadă de timp. Implementarea ei lasa două puncte: probleme în primul rând, nu de multe ori au avut, în care o astfel de interceptare ar fi extrem de important (pentru că un astfel de mecanism în SObjectizer încă nimeni nu poate spune că astfel de probleme nu exista) [1]; pe de altă parte nu vreau să complice mecanisme suplimentare SObjectizer.

Cu toate acestea, uneori, există probleme care pot fi rezolvate prin interceptarea mesajelor mai ușor decât fără interceptare. Ca un exemplu, o astfel de sarcină poate lua în considerare socket TCP / IP server de agent de service. Acest agent trebuie să proceseze mai mult de un soclu, și mai multe - el însuși un socket server care efectuează operațiunea acceptă, și una pentru fiecare soclu conectați.

Un astfel de agent de server ar putea pentru fiecare conexiune client pentru a crea client service separat doar o singură conexiune. Agent Server pentru a crea agenți de subsidiare în secret. și anume cu privire la existența lor nu are nevoie de nimeni să știe, din exterior ar trebui să fie vizibil pentru agentul server numai.

Dar pentru o astfel de problemă de agent implicit: serverul de agent de utilizator trimite mesaje msg_send_package. msg_unblock_channel. agent de server msg_close_channel. În plus, utilizatorul poate trimite aceste mesaje recomandabil. Ca urmare, agentul de server ar trebui să fie doar aceste mesaje pentru a le trimite la agentul dorit pentru copil. Dar, de exemplu, pentru că este decizia msg_send_package prea risipitor.

Mai precis, problema, care a fost interceptarea și mesaje de redirecționare cruciale a existat și au fost rezolvate cu succes cu ajutorul bibliotecii MBAPI. Dar MBAPI în plus față de a intercepta și redirijarea mesaje adăugarea unor caracteristici specifice. Dar interceptarea critică la exact sarcinile SObjectizer-posturi nu a fost într-adevăr.

Interceptor poate servi ca un obiect care implementează interfața de mai jos:

Metoda message_interceptor_t :: Mâner primește ca argument source_info structură cu o descriere completă a mesajului exemplu (care include agentul, numele proprietarului, numele mesajului, numele agentului receptor, un pointer la identificatorul corpul mesajului canalului de comunicare, în care este transmis un mesaj, și așa mai departe. d.). Argumentul current_info conține o descriere completă a instanței curente a mesajului. Descrierea inițială și în curs de desfășurare nu poate coincide cu trecerea de la unul din interceptor în lista la alta.

Metoda message_interceptor_t :: manevreze trebuie să fie returnate în valorile parametrilor de rezultat care înlocuiesc parametrii mesajului inițial. Deci, în cazul în care interceptor înlocuiește numele destinatarului, numele trebuie să fie specificate în rezultat.

Interceptor poate indica:

  • care trec prin lista de interceptare trebuie să fie oprită, iar copia mesajului pentru a arunca și nu pentru a efectua mesajul de programare;
  • care trec prin lista de interceptoare trebuie să se oprească și să utilizeze valorile current_info și rezultat pentru formarea unei copii a mesajului modificat. Acest exemplar este cheltuit pe programare;
  • care trec prin lista de interceptoare trebuie să continue și să utilizeze valorile current_info și rezultat pentru formarea unui nou current_info înainte de a merge la următoarea separatorului.

Poate schimba spargatori de coduri:

  • numele destinatarului mesajului;
  • identificator de canal în care trimite mesajul.

Pentru a instala separatorului, puteți utiliza următoarele funcții:

Funcția poate fi utilizată pentru îndepărtarea interceptor:

Notă. Rămâne întrebarea de ce să facă cu confiscarea separatorului, care este folosit pentru a adăuga o caracteristică sau setup_interceptor_before setup_interceptor_after - pentru că atunci sfâșiate special construit de lanțul de utilizator.

Este de așteptat să utilizeze intreceptorilor după verificare, de exemplu, corectitudinea se va efectua mesaje (adică metoda implicată verificatorului) și aplicațiile înainte de a fi plasate în coada de expediere.

Acest lucru înseamnă că mesajele amânate și periodice vor trece prin lista de interceptori numai după firul cronometru pentru a le trimite la programarea.

Deoarece verificarea mesajelor se realizează corectitudinea dacă este activată kernel SObjectizer, iar interceptor mesaj de apel este în valoare de a face, dacă kernel-ul activat. Acest lucru înseamnă că interceptoare poate face un apel funcții SObjectizer Run-Time, de exemplu, pentru a trimite mesaje noi.

Înainte de a recurge la obiectul original interceptoare este creat message_routing_info_t cu descrierea inițială a mesajului. Acest lucru va fi parametrul obiect source_info. Din construit parametrul obiect current_info.

După aceea, mișcarea lista interceptor. După un apel la următorul interceptor bazat pe rezultatul și current_info construiește noi current_info valoare. În cazul în care interceptor interzice referire la interceptorii rămase (de exemplu, interceptarea comunicațiilor), mișcarea se oprește lista interceptor. În caz contrar, o apelați următoarea interceptor din listă.

După finalizarea mișcării listei de interceptare:

  • în cazul în care rutarea mesajul a fost interzis la toate, copia mesajului este pur și simplu aruncat afară;
  • în caz contrar, pe baza current_info modificat exemplarul original al mesajului și că el a trimis la rutarea.

Mai jos este un mesaj msg_send_package exemplu interceptoare pentru agentul, priza serverul de serviciu. Acest agent creează un agent de copil pentru fiecare conexiune client. In filiale nume de agent sunt formate în conformitate cu principiul :. în cazul în care părintele - numele agentului-mamă, iar clientul - este un identificator de client intern se potrivește cu valoarea comm_channel_t :: client ().

Interceptarea este de a atribui numele agentului post-filială ca numele agentului destinatarului (de exemplu, pentru a produce un agent vizat trimiterea de mesaje către copil).

articole similare