Zastosowanie
W Comarch e-Sklep Sync istnieje możliwość obsługi dodatkowych funkcji za pomocą tzw. Workerów. Dzięki tym programom można odpytywać zewnętrzne usługi sieciowe, bazy danych itp. a następnie zwracać określone dane, które potem będą wyświetlane w Comarch e-Sklep. Workery są to klasy dziedziczące po klasie Comarch.eShop.Isync.Worker:
Klasa:
public abstract class Worker
{
protected Dictionary _config;
public virtual void Initialize(Dictionary d)
{
_config = d;
}
public abstract Task Execute(Ipool pool, Msg msgOuter);
}
Schemat komunikacji Comarch e-Sklep Sync
- W Comarch e-Sklep zostaje odpytana akcja z Worker i Message (w Comarch e-Sklep Sync powinien być taki Worker).
- Worker wykonuje akcje na podstawie Message.
- Worker zwraca wynik do sklepu w postaci JSONA.
- Zmodyfikowany szablon wyświetla informacje z otrzymanego JSONA.
Jak stworzyć przykładowego Workera?
W Comarch e-Sklep Sync konfigurujemy przykładowy Worker:
public abstract class Worker
{
protected Dictionary _config;
public virtual void Initialize(Dictionary d)
{
_config = d;
}
public abstract Task Execute(Ipool pool, Msg msgOuter);
}
oraz implementującą metodę Execute:
namespace WorkerTime
{
using System;
using System.Threading.Tasks; using Comarch.eShop.Isync;
public class Time : Worker
{
private bool _utc;
public override void Initialize(System.Collections.Generic.Dictionary d)
{
_utc = d["utc"] == "1";
}
public override Task Execute(/*Ipool pool,*/ Msg msgOuter)
{
return Task.Factory.StartNew((o) =>
{
var m = o as Msg;
m.Response = string.Concat("\"", (_utc ? DateTime.UtcNow : DateTime.Now).ToString("o"), "\""); return m;
}, msgOuter);
}
}
}
Przykładowy kod:
namespace WorkerTime
{
using System;
using System.Threading.Tasks; using Comarch.eShop.Isync;
public class Time : Worker
{
private bool _utc;
public override void Initialize(System.Collections.Generic.Dictionary d)
{
_utc = d["utc"] == "1";
}
public override Task Execute(/*Ipool pool,*/ Msg msgOuter)
{
return Task.Factory.StartNew((o) =>
{
var m = o as Msg;
m.Response = string.Concat("\"", (_utc ? DateTime.UtcNow : DateTime.Now).ToString("o"), "\""); return m;
}, msgOuter);
}
}
}
Metoda Execute jako drugi parametr przyjmuje obiekt klasy Msg, który posiada property Message oraz Response. W Message jest json, który zawiera dane przesłane requestem z Comarch e-Sklep, których po deserializacji można użyć jako parametrów dla pisanego workera.
Dane wynikowe, które chcemy zwrócić do Comarch e-Sklep należy również serializować do json’a oraz przypisać je do property Response klasy Msg.
Konfiguracja Workera
Tak napisaną klasę należy następnie dodać do pliku configWorkers.json, który zawiera wszystkie Workery zarejestrowane w aplikacji.
Wpis dodający workera wygląda następująco:
{
"Key": "timelocal",
"Assembly": "WorkerTime.dll",
"Type": "WorkerTime.Time",
"Default": false,
"Config": {
"utc": "0"
}
},
| P l i k c o n f i g W o r k e r s . j s o n | |
| P a r a m e t r | O p i s |
| Key | To unikatowa nazwa workera przesyłana z requestem dzięki, której aplikacja wie któryz zarejestrowanych workerów powinien obsłużyć request, |
| Assembly | Nazwa assembly, gdzie znajduje się worker, którego chcemy dodać |
| Type | Nazwa klasy będącej workerem |
| Default | Określa czy jest to domyślny worker. Domyślny worker obsługuje requesty, które nie zawierały nazwy workera |
W sekcji config należy dodać listę parametrów wymaganych do inicjalizacji workera:
public override void Initialize(System.Collections.Generic.Dictionaryd) { _utc = d["utc"] == "1"; }
Akcja SYNC/EXEC
Silnik graficzny Liquid ma akcje sync/exec. Ta akcja odpowiada za komunikację interfejsu z Comarch e-Sklep Sync. Akcja przyjmuje parametry:
| P a r a m e t r | O p i s |
| worker |
|
| message |
Treść polecenia do wykonania przez worker. |
Po wykonaniu akcji zwracana jest odpowiedź. Odpowiedź zawiera obiekt lub kolekcję obiektów, które należy wyświetlić na interfejsie. Kolekcja obiektów zwraca jest przykładowo, gdy procedura SQL zwraca kilka recordsetów.
Kod wywołania:
function getData() {
$.post(null, { action: 'sync/exec', CSRF: CSRF, worker: 'erpData',
message: JSON.stringify(
{
command: 'CDN.eShop_GetOrders',
parameters: { DateFrom: '2017-01-01', DateTo:
'2017-03-31', LanguageId: lngId, PageNo: '1'}
}) }, function (d) { if (!d.action.Result) {
/* wystąpił błąd */
console.log(JSON.stringify(d)) return;
}
var r = d.action.Object[0];
/* wynik */
console.log(JSON.stringify(d))
/* wynik kolekcja */
var r = d.action.Object[0]; console.log(JSON.stringify(r))
var r2 = d.action.Object[1]; console.log(JSON.stringify(r2))
var r3 = d.action.Object[2]; console.log(JSON.stringify(r3))
});
}