Porovnávané verzie

Kľúč

  • Tento riadok sa pridal
  • Riadok je odstránený.
  • Formátovanie sa zmenilo.


Kotva
_Toc490141265
_Toc490141265
5.1. Test správnosti adresovania RPC alebo SBA


Volanie RPC v D2000 obsahuje viacero úrovní adresácie:

...

Zoznam parametrov nie je súčasťou adresy, ale pokiaľ sa RPC zavolá s iným počtom alebo typmi parametrov, ako je deklarovaná, ide o chybu.

V prípade volania SBA je adresácia jednoduchšia (vypadli „use Java", HOBJ ESL Interface a parametre volania majú implicitnú štruktúru).

Vzhľadom na dynamickú povahu konfigurácie aplikácie v D2000 nie je možné zaručiť, že bude RPC vždy dostupná na rovnakom mieste. Aktuálny stav je však možné zistiť volaním metód D2Session.testRPC a D2Session D2Session.testSBA.

Varovanie

Pozor: Metódy zisťujú stav v momente zavolania (resp. doručenia žiadosti na príslušný proces) a tento stav sa môže v reálnom čase zmeniť. V prípade kladnej odpovede sa preto na túto skutočnosť do budúcnosti nedá celkom spoľahnúť. Negatívna odpoveď je však dobrý mechanizmus ako detegovať, že klientská aplikácia nemá uspokojené všetky svoje požiadavky voči D2000 aplikácii.

Nasledujúci príklad demonštruje test, či je možné zavolať:


  • RPC s názvom setData,
  • s parametrami:
    1. vstupný parameter typu INT (meno parametra nie je dôležité),
    2. vstupný parameter typu RECORD NOALIAS(SD.Data),
    3. vstupno-výstupný parameter typu BOOL,
  • implementovaný v ESL časti Event-u E.Service,
  • bežiaci v procese SELFprocese SELF.EVH,
  • nie je to inštančný Event, ani RPC neimplementuje ESL Interface.

...

Budúci výsledok vo forme Future je uložený v premennej upcomingResult. v premennej upcomingResult.

Blok kódu
languagejava
themeEclipse
FutureEvent<Integer> upcomingProcessHobj =
    D2SessionUtils.getFutureObjectHobjByName(session, "SELF.EVH");

...


FutureEvent<Integer> upcomingEventHobj =
    D2SessionUtils.getFutureObjectHobjByName(session, "E.Service");

...


int structureDefinitionHobj = session.getStructDefInfo("SD.Data").getHobj();

...


FutureEvent<Boolean> upcomingResult = session.testRPC(
    false,
    upcomingProcessHobj.get(),
    upcomingEventHobj.get(),
    0, // eventInstanceId
    0, // ESL interface HOBJ
    "SetData",
    new RpcParameterType

...

[

...

]
    

...

{
        RpcParameterTypeFactory.createParameter(false, UnivalType.integer),
        RpcParameterTypeFactory.createParameter(false, structureDefinitionHobj),
        RpcParameterTypeFactory.createParameter(true, UnivalType.bool)
    

...

});

Kotva
_Toc490141266
_Toc490141266
5.2. Čítanie dát z archívu

V nasledovnom príklade je uvedená statická metóda, ktorá umožní asynchrónne čítanie dát z archívu. Pre jednoduchosť sú vypustené niektoré parametre prístupu do archívu. Maximálny počet prečítaných záznamov z archívu je možné limitovať parametrom limitDataLength volania getArchiveValues. Hodnota parametra -1 znamená, že čítanie je bez obmedzenia. Nie je však možné prečítať viac záznamov, ako sa zmestí do pamäte procesu arc.exe.

V príklade je názorne použitá trieda AdjustableFuture, ktorá implementuje rozhranie Značky WikiV nasledovnom príklade je uvedená statická metóda, ktorá umožní asynchrónne čítanie dát z archívu. Pre jednoduchosť sú vypustené niektoré parametre prístupu do archívu. Maximálny počet prečítaných záznamov z archívu je možné limitovať parametrom _limitDataLength_ volania _getArchiveValues{_}. Hodnota parametra -1 znamená, že čítanie je bez obmedzenia. Nie je však možné prečítať viac záznamov, ako sa zmestí do pamäte procesu _arc.exe{_}. V príklade je názorne použitá trieda _AdjustableFuture{_}, ktorá implementuje rozhranie _java.util.concurrent.Future_ a zároveň umožňuje asynchrónne nastaviť hodnotu ako aj pridať asynchrónneho spracovateľa hodnoty. Taktiež je v príklade použitý objekt typu _ObjectInfoCache{_}, ktorý po zvolenú dobu udržiava preklady názvov objektov na ich HOBJ. a zároveň umožňuje asynchrónne nastaviť hodnotu ako aj pridať asynchrónneho spracovateľa hodnoty. Taktiež je v príklade použitý objekt typu ObjectInfoCache, ktorý po zvolenú dobu udržiava preklady názvov objektov na ich HOBJ.

Blok kódu
languagejava
themeEclipse
public static FutureEvent<ArchiveResult> loadArchiveData(
        final D2Session session,
        final IndexedObjectName indexedObjectName,
        final Date beginTime,
        final Date endTime,
        final int limitDataLength) 

...

{

...


    final AdjustableFuture<ArchiveResult> result = new AdjustableFuture<>();

...


    final ObjectInfoCache cache = session.getConnector().getDefaultObjectInfoCache();

...


    final FutureEvent<Integer> futureHobj
            = cache.getHobj(indexedObjectName.getObjectName(), session);

...


    futureHobj.addEventHandler(
            new HobjHandler(result, session, indexedObjectName, beginTime, endTime,
                    limitDataLength));

...


    return result;

...

}

Trieda _ArchiveResult_ obaľuje prečítané hodnoty a popis archívneho objektu. \\

Blok kódu
languagejava
themeEclipse
public class ArchiveResult 

...

{

...


    private final ArchiveObjectDescription description;
    private final List<UnivalValue<?>> values;

...


    private ArchiveResult(
            List<UnivalValue<?>> values,
            ArchiveObjectDescription description) 

...

{
        this.values = values;
        this.description = description;
    

...

}

...


    public ArchiveObjectDescription getDescription() 

...

{
        return description;
    

...

}

...


    public List<UnivalValue<?>> getValues() 

...

{
        return values;
    

...

}

...

}

Trieda _HobjHandler_ spracuje udalosť získania HOBJ na základe mena objektu. V prípade neúspechu indikuje neúspech aj do výsledku pôvodného volania - objekt _result{_}. V prípade úspechu spustí čítanie dát z archívu so zvolenými parametrami.

Blok kódu
languagejava
themeEclipse
private static class HobjHandler
        implements FutureEventHandler<Integer> 

...

{

...


    private final Date beginTime;
    private final Date endTime;
    private Integer hobj;
    private final IndexedObjectName indexedObjectName;
    private final int limitDataLength;
    private final AdjustableFuture<ArchiveResult> result;
    private final D2Session session;

...


    public HobjHandler(
            AdjustableFuture<ArchiveResult> result,
            D2Session session,
            IndexedObjectName indexedObjectName,
            Date beginTime,
            Date endTime,
            int limitDataLength) 

...

{
        this.result = result;
        this.session = session;
        this.indexedObjectName = indexedObjectName;
        this.beginTime = beginTime;
        this.endTime = endTime;
        this.limitDataLength = limitDataLength;
    

...

}

...


    @Override
    public void onException(Throwable error) 

...

{
        result.setException(error);
    

...

}

...


    @Override
    public void onResult(Integer hobj) 

...

{
        this.hobj = hobj;
        session.getArchiveValues(hobj,
                indexedObjectName.getRowIndex(),
                indexedObjectName.getColumnIndex(),
                beginTime,
                endTime,
                0,
                limitDataLength,
                new DataListener());
    

...

}

Spracovanie dát z archívu je implementované v triede _DataListener{_}, ktorá je vnorenou triedou triedy _HobjHandler{_}. Implementuje rozhranie _ArchiveDataListener2{_}, ktoré je rozšírením rozhrania _ArchiveDataListener{_}.

Archív ako prvé pošle popis archívneho objektu. Následne posiela načítané dáta v balíkoch maximálne po 1000 záznamoch, ktoré zoradené vzostupne podľa časovej značky. Posledný balík dát je indikovaný hodnotou _true_ parametra _noMoreData{_}. Vtedy je možné čítanie ukončiť a výsledok uložiť do premennej _result{_}.

Prípadnú chybu indikuje archív chybovým kódom. Chyba môže nastať kedykoľvek pred doručením posledného balíka dát - t.j. na začiatku aj po prijatí jedného alebo viacerých balíkov.

V prípade, že zoznam prijatých hodnôt z archívu bol orezaný podľa parametra _limitDataLength_ - v archívnej databáze sa v časovom intervale od _beginTime_ po _endTime_ nachádzajú ešte nejaké ďalšie hodnoty - tak bude pred posledným balíkom dát zavolaná metóda _onMoreDataInArchive{_}. Vtedy je možné v čítaní pokračovať nadväzujúcou požiadavkou na archív.<ac:structured-macro ac:name="anchor" ac:schema-version="1" ac:macro-id="03db1824-dbc8-4270-a8d7-54045d95522b"><ac:parameter ac:name="">_GoBack</ac:parameter></ac:structured-macro> limitDataLength – v archívnej databáze sa v časovom intervale od beginTime po endTime nachádzajú ešte nejaké ďalšie hodnoty – tak bude pred posledným balíkom dát zavolaná metóda onMoreDataInArchive. Vtedy je možné v čítaní pokračovať nadväzujúcou požiadavkou na archív.

Blok kódu
languagejava
themeEclipse
private class DataListener
        implements ArchiveDataListener2 

...

{

...


    private ArchiveObjectDescription description = null;
    private boolean moreDataInArchive = false;
    private boolean skipFirst = false;
    private final List<UnivalValue<?>> values = new ArrayList<>();

...


    @Override
    public void onArchiveData(UnivalValue<?>

...

[

...

] data, boolean noMoreData) 

...

{
        List<UnivalValue<?>> list = Arrays.asList(data);
        if (this.skipFirst) 

...

{
            list = list.subList(1, data.length);
            this.skipFirst = false;
        

...

}
        values.addAll(list);
        if (noMoreData) 

...

{
            if (this.moreDataInArchive) 

...

{
                this.moreDataInArchive = false;
                this.skipFirst = true;
                session.getArchiveValues(hobj,
                        indexedObjectName.getRowIndex(),
                        indexedObjectName.getColumnIndex(),
                        data

...

[data.length - 1

...

].getValueTime(),
                        endTime,
                        0,
                        limitDataLength,
                        this);
            

...

} else 

...

{
                result.setValue(new ArchiveResult(values, description));
            

...

}
        

...

}
    

...

}

...


    @Override
    public void onArchiveObjectDescription(ArchiveObjectDescription description) 

...

{
        this.description = description;
    

...

}

...


    @Override
    public void onError(D2JapiErrorCode errorCode) 

...

{
        result.setException(new D2JapiException(errorCode));
    

...

}

...


    @Override
    public void onMoreDataInArchive() 

...

{
        this.moreDataInArchive = true;
    

...

}

...

}