Komunikaty¶
Komunikaty są prostymi obiektami, które oprócz informacji o typie wiadomości niosą również dodatkowe, zdefiniowane dane. Komunikaty powinny być jak najprostsze i umożliwiające serializację danych.
Komunikaty dzielimy na:
- Komendy (command) - komunikat służący do imperatywnego zgłoszenia na wykonanie konkretnej operacji.
- Zdarzenia (event) - komunikat informujący, że coś się stało w systemie.
Zdarzenia są przetwarzane przez wszystkie handlery obsługujące dany typ zdarzenia. Natomiast komendy przetwarzane są tylko przez handler wskazany podczas wysyłania komendy lub ustawiony we wskazanym konektorze.
Dodatkowe struktury komunikatu (payload)¶
Może się zdarzyć, że przygotowane komunikaty nie mogą już zostać zmodyfikowane ze względu na zabezpieczenie projektu, w którym zostały zdefiniowane lub ich ogólne przeznaczenie nie pozwala na dodanie kolejnych pól związanych z bardzo wąskim obszarem. Przykładowo komunikat komendy OCR faktury może być wspólny dla różnych obszarów systemu, np.: WFFA, TD, itp., ale zachowanie po jego przetworzeniu może się diametralnie różnić.
W celu umożliwienia uszczegółowienia komendy istnieje mechanizm pozwalający na dodawanie dodatkowych informacji do komunikatów, tzw. payload.
Każdy komunikat (event lub command) udostępnia metody pozwalające na zarządzanie dodatkowymi obiektami, które będą przekazywane razem z treścią komunikatu.
Ważne!
Każdy komunikat może posiadać dowolną liczbę obiektów dodatkowych, ale muszą być one różnych typów.
Przykład¶
W mechanizmie OCR faktur kosztowych posiada tylko informację o pliku, który ma zostać poddany procesowi OCR, ale nie przekazuje informacji dla jakiego rekordu w systemie ten proces jest wykonywany. Aby komenda OCR pozostała jak najbardziej ogólna, informacje o kontekście uruchomienia tej komendy są przekazywane w metoda dodatkowych.
//utworzenie obiektu komendy
var command = new OCR.InvoiceOCRCommand
{
FilePath = GUI.GetRepositoryFilePath(comment.FILENAME, "WORKFLOW", true)
};
//dodanie informacji o kontekście wywołania komendy
var info = new CostInvoiceInfo
{
InvoiceRef = this.REF.AsInteger
};
command.GetOrAddPayload(info);
Informacja ta jest potrzebna w dalszej części procesu, który odpowiada za odebranie danych z usługi OCR i zapisanie w strukturach systemu Teneum. Pozwala również określić czy danych handler powienien taki komunikat dalej przetwarzać.
//Metoda reaguje na zakończenie procesu OCR, który jest sygnalizowany przez pojawienie sie komunikatu typu InvoiceOCRCompletedEvent
public HandlerResult InvoiceOCRCompletedEventHandler(ConsumeContext<OCR.InvoiceOCRCompletedEvent> context)
{
//Metoda sprawdza czy zdarzenie posiada informacje dodatkowe pochodzące z modułu WFFA i na tej podstawie określa czy zdarzenie będzie dalej przetwarzane.
CostInvoiceInfo costInvoiceInfo;
if (!context.Message.TryGetPayload<CostInvoiceInfo>(out costInvoiceInfo))
{
return HandlerResult.Unhandled;
}
//Pobiera informacje dodatkowe, które są wymagane do kontynuowania procesu
var invoiceRef = costInvoiceInfo.InvoiceRef;
if (MapSkanujToOCRDocument(invoiceRef, context.Message))
{
return HandlerResult.PipeSuccess;
}
return HandlerResult.Handled;
}