Programovanie

Ľahko vyvíjajte konfigurovateľné softvérové ​​aplikácie

Vývoj ľahko konfigurovateľného softvéru má v dnešnom obchodnom prostredí prvoradý význam. Softvérové ​​aplikácie sa už neposudzujú iba podľa množstva obchodnej logiky, ktorú obsahujú; hodnotia sa tiež podľa toho, ako ľahko sa udržujú. Schopnosť meniť správanie softvéru prostredníctvom konfigurácie tvorí dôležitý aspekt tohto cyklu údržby.

Zatiaľ čo jazyk Java poskytuje na uľahčenie konfigurácie množstvo funkcií, ako napríklad súbory vlastností a zväzky zdrojov, v dnešných dynamických obchodných prostrediach tieto funkcie chýbajú. Mnoho štandardov, nástrojov a kontajnerov Java už používa pokročilejšie a prispôsobiteľnejšie formáty konfigurácie XML.

Obix Framework je rámec otvoreného zdroja, ktorý poskytuje bežné prostriedky a formáty na ukladanie konfiguračných údajov v XML a na prístup k týmto údajom prostredníctvom jednoduchých objektov Java. Umožňuje modularizáciu konfiguračných údajov tým, že umožňuje importovanie a vzájomné vkladanie konfiguračných súborov a organizovanie konfiguračných informácií do „modulov“.

Okrem toho podporuje „horúce“ zmeny v konfigurácii - prostredníctvom automatickej detekcie a automatického načítania zmien v konfiguračných údajoch - a tiež poskytuje podporu pre rozhranie Java Naming and Directory Interface API (JNDI). Ďalej ho možno integrovať do aplikácií Java mnohými spôsobmi, napríklad prostredníctvom Java Management Extensions (JMX) a Java Platform, poslucháčov Enterprise Edition, ktorí nevyžadujú kódovanie, ako aj jednoduchých tried Java, na ktoré je možné vyvolať priamo. Rámec nakoniec poskytuje ľahko použiteľné rozhranie API doplnku, ktoré vývojárom umožňuje rozšíriť ho o úlohy spojené s inicializáciou. Toto API použil tím Obix na poskytnutie inicializačných nástrojov pre ďalšie rámce otvoreného zdroja, ako sú napríklad Ap4's log4j, Hibernate a Commons DBCP (fondy databázových pripojení).

V tomto tutoriále popisujem hypotetický scenár, ktorý vyžaduje konfigurovateľný softvér a pre ktorý vytvárame skeletové aplikácie pomocou Obixu. Prvý príklad poskytuje najbližšiu vec konceptu koncepcie v štýle „Hello World“, zatiaľ čo druhý a tretí rozširujú túto aplikáciu o menej triviálne aspekty konfigurácie.

Upozorňujeme, že všetky ukážky kódu v tomto článku sú zabalené ako archív, ktorý je možné stiahnuť pomocou odkazu uvedeného v Zdrojoch.

Problémový scenár

Oceňovanie finančných aktív, ako sú akcie alebo opcie, niekedy zahŕňa tisíckrát simuláciu ceny aktíva a výpočet priemeru týchto hodnôt - vo viere, že priemer poskytuje najlepší odhad, pokiaľ ide o „skutočnú“ budúcu hodnotu aktíva. Takéto simulácie typicky vyžadujú štatistický vstup vo forme aktuálnej ceny aktíva (aktív), priemernej ceny za dané časové rozpätie, ako aj odchýlky od priemeru.

Predpokladajme, že vytvárame aplikáciu na oceňovanie týchto nástrojov. Táto aplikácia si bude musieť stiahnuť štatistické vstupy prostredníctvom webovej služby a podrobnosti - napríklad URL a autentifikačné informácie - pre pripojenie k tejto službe sú uložené v konfiguračnom dokumente. Stačí povedať, že počet simulácií, ktoré sa majú vykonať pre danú požiadavku na ocenenie, by mal byť tiež flexibilný a ako taký bude špecifikovaný prostredníctvom konfigurácie.

Príklad 1: Základný konfiguračný súbor

V tomto príklade vytvoríme pre našu aplikáciu základný konfiguračný súbor example1-config.xml, ktorý obsahuje podrobnosti o pripojení k webovej službe, ktorá poskytuje štatistické vstupy do procesu oceňovania. Tento konfiguračný súbor tiež uloží počet simulácií, ktoré sa majú vykonať pre každú požiadavku na ocenenie. Tento súbor (rovnako ako konfiguračné súbory pre ďalšie príklady) sa nachádza v konfiguračnom adresári stiahnuteľného archívu spojeného s týmto tutoriálom. Obsah konfiguračného súboru je uvedený takto:

//www.some-exchange.com/marketdata

trading_app_dbo

nopassword

10000

Ak súbor preskúmame podrobnejšie, všimnite si, že začína koreňovým uzlom ; týmto sa označuje začiatok konfiguračného dokumentu Obix. Sú tu štyri uzly, z ktorých každý obsahuje jeden údaj o konfigurácii. Prvé tri obsahujú adresu URL, ID používateľa a heslo na pripojenie k službe vstupov; posledná položka obsahuje počet simulácií, ktoré sa majú vykonať pre každú žiadosť o ocenenie. Všimnite si, že každá položka má jedinečný kľúč, ako je špecifikované v entryKey atribút a že hodnota v každej položke je zapuzdrená znakom a uzol.

Ďalej vytvoríme kostru našej hodnotiacej aplikácie a čo je dôležitejšie, ukážeme, ako sa konfiguračný dokument číta za behu. Trieda záujmu sa nazýva Example1.java a nájdete ich v priečinku src v archíve na stiahnutie, ktorý je spojený s týmto tutoriálom. Definícia triedy je nasledovná:

importovať org.obix.configuration.Configuration; import org.obix.configuration.ConfigurationAdapter; importovať org.obix.configuration.ConfigurationAdapterFactory;

verejná trieda Example1 {public static void main (String [] args) {ConfigurationAdapterFactory adapterFactory = ConfigurationAdapterFactory.newAdapterFactory ();

ConfigurationAdapter adapter = adapterFactory.create (null);

adapter.adaptConfiguration (Configuration.getConfiguration (), "config / example1-config.xml"); printMarketDataInfo (); }

private static void printMarketDataInfo () {Configuration globalConfig = Configuration.getConfiguration ();

System.out.println ("URL dátovej služby: \ t \ t" + globalConfig.getValue ("market.data.service.url"));

System.out.println ("ID používateľa dátovej služby: \ t \ t" + globalConfig.getValue ("market.data.service.uid"));

System.out.println ("Heslo dátovej služby: \ t \ t" + globalConfig.getValue ("market.data.service.password"));

System.out.println ("Počet simulácií: \ t \ t" + globalConfig.getValue ("number.of.valuation.simulation")); }}

Ak chcete spustiť tento a ďalšie príklady, musíte si stiahnuť binárne súbory Obix Framework na miesto prístupné cez vašu cestu k triede. Vaša trieda musí odkazovať na knižnicu Obix, obix-framework.jar, ktorý sa nachádza v priečinku lib v koreňovom adresári rámca. Budete tiež potrebovať nasledujúce knižnice open source tretích strán: dom.jar, jaxen-full.jar, sax.jar, saxpath.jara xercesImpl.jar, ktorý sa nachádza v priečinku lib / thirdParty v koreňovom adresári rámca.

Vykonanie tejto triedy by malo priniesť nasledujúci výsledok:

URL dátovej služby: //www.some-exchange.com/marketdata ID používateľa dátovej služby: trading_app_dbo Heslo dátovej služby: nopassword Počet simulácií: 10 000 

Aby sme rozobrali túto triedu, začneme hlavnou metódou. Prvý riadok tejto metódy vytvára inštanciu triedy org.obix.configuration.ConfigurationAdapterFactory, ktorý je zodpovedný za vytvorenie konfiguračného adaptéra (inštancia triedy org.obix.configuration.ConfigurationAdapter). Adaptér je zase zodpovedný za skutočné načítanie konfiguračného dokumentu z daného umiestnenia (zadaného ako cesta k súboru alebo URL).

Nasledujúci výpis kódu načíta obsah nášho konfiguračného súboru do inštancie globálnej / statickej konfigurácie vyvolaním metódy adaptéra adaptConfiguration ()a odovzdaním odkazu na globálnu inštanciu - ako je získaný z hovoru Configuration.getConfiguration ()—A cesta k nášmu konfiguračnému súboru config / example1-config.xml:

adapter.adaptConfiguration (Configuration.getConfiguration (), "config / example1-config.xml"); 

Upozorňujeme, že je možné vytvoriť novú inštanciu konfigurácie na ukladanie našich konfiguračných údajov, a nie použiť statickú (globálnu) inštanciu, ale pre jednoduchosť (a stručnosť) použijeme v tomto príklade statickú inštanciu.

Ďalej krátko preskúmame metódu printMarketDataInfo (), ktorý jednoducho načíta konfiguračné položky (t. j Uzly XML) a vytlačí ich hodnoty (t. J. Ich detské uzly). Všimnite si, že hodnota každého záznamu sa získa volaním metódy getValue (...) na združených Konfigurácia inštancia, zadanie názvu / kľúča záznamu - ako je určené pre vstupný uzol entryKey atribút. Ako dodatok upozorňujeme, že položka môže mať viac hodnôt, čo si ukážeme neskôr v tomto návode.

Príklad 2: Modularizácia konfiguračných údajov

Aplikácie tohto druhu zvyčajne vygenerujú správu s podrobnými výsledkami žiadosti v akomsi formáte. Naša hypotetická aplikácia sa nijako nelíši; je schopný vytvárať správy o oceneniach v rôznych formátoch. Formáty prehľadov použité v danom spustení aplikácie sú navyše diktované položkou konfigurácie a všetky vygenerované správy sa odosielajú e-mailom zoznamom príjemcov v našej organizácii, kde sú príjemcovia tiež uvedení v konfiguračnej sade.

Logicky je vykazovanie samostatnou súčasťou funkčnosti - v porovnaní s oceňovaním - aj keď obe spolu súvisia; takže by bolo celkom rozumné zapuzdriť naše „nahlasovacie“ konfiguračné údaje. Toto poskytuje nielen čistejšie oddelenie konfiguračných údajov, ale aj začiatočníkovi uľahčuje vizualizáciu vymedzenia funkčnosti v aplikácii.

Konfiguráciu prehľadov pre tento príklad zapuzdríme vytvorením konfiguračného modulu pre prehľady, ktorý je potomkom nášho koreňového modulu. Konfiguračný súbor z posledného príkladu upravíme tak, že pripojíme uzol zobrazený nižšie k jeho zoznamu uzlov; výsledný súbor sa volá example2-config.xml a je možné ho nájsť v konfiguračnom adresári zdrojového archívu.

.................... .................... .......... ......... [email protected]

tabuľkový textový súbor pdf

V tomto konfiguračnom súbore okamžite vyniknú dve veci: prvou je samozrejme naša definícia modulu , za ktorým nasleduje druhý vstupný uzol modulu . Začíname definíciou modulu. Konfiguračný dokument Obix môže obsahovať ľubovoľný počet podmodulov. Blokovanie dvoch prvkov - v tomto výučbe sa to nezaoberá - moduly podporujú rovnakú sadu uzlov ako koreňový modul. Inými slovami, moduly majú položky a môžu obsahovať ďalšie moduly; preto môžu byť moduly efektívne použité na replikáciu stromovej štruktúry.

Pripomeňme si, že v poslednom príklade som spomenul, že konfiguračný záznam môže mať viac hodnôt. Túto funkčnosť demonštruje položka konfigurácie pre uchovávanie formátov hlásenia, t. J. . Ako vidíte, toto sa líši od ostatných záznamov tým, že má tri hodnoty - určuje tri formáty, v ktorých by sa mali prehľady generovať.

Teraz preskúmame kód Java na čítanie položiek v našom konfiguračnom module vykazovania. Zdroj Java upravujeme pre predchádzajúci príklad pridaním nasledujúcej metódy; upravený zdrojový súbor (trieda) sa premenuje Example2.javaa nájdete ich v priečinku src archívu spojeného s týmto tutoriálom:

private static void printReportingConfig () {Configuration globalConfig = Configuration.getConfiguration ();

Konfigurácia reportingConig = globalConfig.getModule ("reporting.parameters");

System.out.println ("Cieľ zostavy: \ t \ t" + reportingConig.getValue ("reports.destination.email"));

System.out.println ("Formáty prehľadov: \ t \ t" + reportingConig.getValues ​​("report_formats")); }

Pri vykonávaní tejto triedy by mala produkovať výstup:

URL dátovej služby: //www.some-exchange.com/marketdata ID používateľa dátovej služby: trading_app_dbo Heslo dátovej služby: nopassword Počet simulácií: 10 000

Parametre konfigurácie prehľadu = Cieľ prehľadov: [email protected] Formáty prehľadu: [tabuľka, textový súbor, pdf]

Po podrobnom preskúmaní dodatočnej metódy si všimneme, že najskôr získa odkaz na globálnu Konfigurácia inštancia; potom pokračuje v získaní odkazu na konfiguračný modul, ktorý obsahuje informácie o konfigurácii hlásenia. Metóda dosahuje tieto úlohy vyvolaním metódy getModule (...) na nadradenom module a odovzdaním ID modulu, ktorý sa má prijať. Upozorňujeme, že táto syntax je všeobecná v tom zmysle, že získanie potomka ktoréhokoľvek modulu - aj keď nie koreňového - sa dosiahne vyvolaním getModule (...) na danom module.

$config[zx-auto] not found$config[zx-overlay] not found