UserExit v Java Web App

mikrom

UserExit v Java Web App
« kdy: 14. 04. 2016, 00:24:02 »
Mam takyto dotaz. Potreboval by som do Java-Web-aplikacie namontovat nejaky UserExit, kde by si klient naprogramoval vlastnu logiku nastavovania jednotlivych parametrov, bez toho aby sa vzdy musela rebuildovat cela Java aplikacia.
Ako riesenie sa mi zda nejaky skript v ktorom by sa zavolala nejaka funkcia, napr. ako

public MyUserExitResult methodOfMyUserExit(MyUserExitTO myUserExitTo)

ktora by dostala na vstupe z Java-aplikacie datovu strukturu class MyUserExitTO a na vystupe by na zaklade implementobvanej logiky vratila (naplnila) datovu strukturu MyUserExitResult

Na zaklade hodnot v MyUserExitResult by potom prebehlo dalsie spracovanie v Java-Web-Aplikacii.

Mne by bolo sympaticke pouzit napr. Groovy alebo to je jedno co - aj napriklad JavaScript, alebo iny skript. jazyk na Java platforme, ak by to bolo mozne, t.j. ak tento Jazyk vie prevziat instanciu Java-class MyUserExitTo a vratit MyUserExitResult.

Mate s tym niekto skusenosti? Co by bolo dobre pouzit?

Ina otazka: Mohol by klient pouzit na UserExit aj Javu (ako skriptovaci jazyk) bez toho, ze by musel rebuildovat celu aplikaciu, alebo ze by si zbuildoval len svoj vlastny modul (Class, alebo Jar) (ja stale rozmyslam nad Java Reflection API ale nejako sa neviem v tom posunut) ?

Mozno to pre niekoho zneje trochu nezrozumitelne, ale napr. v starych COBOL aplikaciach je uplne bezne, ze klient dostane aplikaciu a skompiluje k tomu iba svoje specificke moduly tzv UserExity, kde si sam naimplementuje specificku logiku, ktoru potrebuje.
Vlastne zbuilduje len svoje moduly a celkovej aplikacie, ktoru dostal od dodavatela sa ani nedotkne.

Su taketo UserExity mozne aj pri Webovej aplikacii v Jave ?
 


Re:UserExit v Java Web App
« Odpověď #1 kdy: 14. 04. 2016, 06:53:56 »
Můžete použít Groovy, JavaScript i Javu. Z vašeho popisu ale vůbec není jasné, o co se vlastně snažíte – popište to nakonkrétním příkladu. Změnit parametry aplikace můžete samozřejmě bez rebuildu aplikace – prostě změníte hodnotu tam, kde ten parametr máte v Javě uložený, a při příštím čtení použijete jeho novou hodnotu.

none_

Re:UserExit v Java Web App
« Odpověď #2 kdy: 14. 04. 2016, 10:11:29 »
Nevim, jestli presne chapu, co chcete udelat, ale neco podobneho jsem jednou delal.

Jednalo se o webapp, ktera mela "pluginy" pro integraci s dalsimi systemy. Plugin bylo proste JAR, ktery mel jednu tridu implementujici nejake rozhrani (a hromadu dalsich trid). JARka se nakopirovala kamsi a na stisknuti tlacitka se nahraly do moji webapp. Ta nasledne volala metody daneho rozhrani. Existuji na to knihovny, ktery to ulehcujou. Myslim, ze jsme pouzivali tuhle: https://github.com/kamranzafar/JCL/ Kazdopadne jsem z projektu odesel v dobe, kdy vysla prvni verze, takze nevim, jake s tim byly zkusenosti za behu.

Re:UserExit v Java Web App
« Odpověď #3 kdy: 14. 04. 2016, 19:42:34 »
Jde to docela snadno:

  • klient si vytvoří třídu, která implementuje určené rozhraní
  • klient si třídu zkompiluje, vytvoří jar soubor a nahraje ho do aplikace
  • v konfiguraci té aplikace uvede, jaká třída se má použít jako ten plugin
  • aplikace pak už sama pomocí reflexe vyhledá třídu, vytvoří její instanci a volá libovolné metody rozhraní

Pokud by vadila tvorba jar souboru, lze javu zkompilovat a použít za běhu, používal jsem na to Janino http://unkrig.de/w/Janino V novější jave to už jde udělat bez pomoci externích knihoven (nezkoušel jsem).

Nebo jde použít jednodužšší postup, kdy si klient může psát skripty, osvědčil se mi Beanshell http://www.beanshell.org/ resp. https://github.com/beanshell/beanshell/releases Aplikace pak například do skriptu vloží určité proměnné, které budou ve skriptu dostupné, tělo skriptu se vyhodnotí evalem a po skončení skriptu si aplikace vyzvedne návratovou hodnotu skriptu anebo přečte hodnoty proměnných. Stejně to bude fungovat i u jiných jazyků, ale neměl jsem potřebu zkoušet něco jiného než Beanshell.

Počítejte, že spuštění klientského kódu může představovat různá rizika - bezpečnostní (získání nebo zápis dat mimo oprávnění), výkonová (např. vyčerpání paměti v případě memory leaků). Dále může být problém stanovit, kdo za problém může, pokud například poskytujete servis nebo zaručujete funkčnost na určité úrovni.

Re:UserExit v Java Web App
« Odpověď #4 kdy: 14. 04. 2016, 22:30:42 »
Ono to s tím pluginem v Javě zase tak snadné není, musíte tam mít oddělené classloadery, aby byl uživatel schopen ten plugin odstranit, případně nainstalovat novou verzi. Tazatel ale psal o skriptovacích jazycích, ty takhle použije mnohem snáz. Akorát že tazatel psal něco o redeploy aplikace, přitom ale vůbec není jasné, proč by něco takového chtěl dělat.


Re:UserExit v Java Web App
« Odpověď #5 kdy: 15. 04. 2016, 10:58:52 »
Pokud může restartovat aplikaci, nemusí řešit classloadery. Pokud použije Janino, může do aplikace nahrávat .java soubory a bude se to chovat jakoby tam byly .class soubory, přičemž je může dokonce naživo upravovat (zkompiluje je za běhu). Se skriptovacím jazykem to má ještě snažší.

Pokud restartovat nechce, bude asi nejlepší pokud by použil třeba https://cs.wikipedia.org/wiki/OSGi_Service_Platform nebo ekvivalent. Ale to už je mnohem náročnější.