SigmaT.

Relaterede dokumenter
Databaseadgang fra Java

Software Construction 1 semester (SWC) Spørgsmål 1

Dag 10 Flertrådet programmering

Hvordan vælger jeg dokumentprofilen?

Eksempel på en database: studenter, kurser, eksamener

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Singleton pattern i Java

A Profile for Safety Critical Java

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Test af It-komponent

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Løsning af skyline-problemet

MySQL i Java. Tutorial lavet af Jákup W. Hansen TSU semester 05.januar 2007

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Ugeseddel 4 1. marts - 8. marts

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.

Videregående programmering i Java

Løsning af møntproblemet

BRP Kursusintroduktion og Java-oversigt

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Tree klassen fra sidste forelæsning

Virkefeltsregler i Java

Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben

Introduktion til ActionScript, fortsat

SAX Simple API for XML.

KIH Database. Systemdokumentation for KIH Databasen. 12. september Side 1 af 20

Anvendelse af metoder - Programmering

KIH Database. Systemdokumentation for KIH Databasen. 1. maj Side 1 af 13

Hvad er et distribueret objekt? Plan Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation

Tabelbegrebet. Klassediagrammer (III) Oversigt. Anvendelse af Tabeller. Tabeller og qualified associations

Videregående programmering i Java

DM502. Peter Schneider-Kamp

Web- og serverprogrammering

Model Drevet Design i Praksis

02101 Indledende Programmering Introduktion til Eclipse

DANMARKS TEKNISKE UNIVERSITET

SOSI STS Dokumentationsoverblik

Fundamentale sprogbegreber

Webserverprogrammering

software bricks & glue for system integration

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

SAS USER FORUM DENMARK 2017 USER FORUM. Rune Nordtorp

Kursus navn: Indledende programmering Kursus nr

Objektorienterede metoder

Version Dato Beskrivelse /11/2012 Initial version /03/2013 Tilføjet eksempel med Template Agent, generelt udvidet dokumentet.

Eksempel: et ordresystem note 5 Lagdeling s. 1

Objektorienteret Programmering

Om binære søgetræer i Java

Affaldsdatasystem Vejledning supplement i system-til-system integration for.net brugere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

Skriftlig eksamen i Datalogi

Transkript:

Java + Groovy

Disposition Om SigmaT Eksempel på indlejring af Groovy Overvågning af PEM Ønske om dynamisk loaded Java uden at fifle med classloaderen Groovy til hjælp Opsamling hvad jeg ikke har fortalt om

SigmaT Trym Reinholdt Møller, SigmaT Freelance J2EE konsulent 36 år Har to børn og bor i Risskov Har tidligere arbejdet ved Creuna, Terma og Acure, An IBM Division http://sigmat.dk

Groovy eksempel GroovyRunner i Eclipse

Om PEM Personlig Elektronisk Medicinprofil (PEM) Integrerer til 250 kørende apotekssystemer, der hvert minut henter informationer eller opdaterer disse Integrerer til samtlige lægehuse, der sender elektroniske recepter Krav om høj oppetid samt stor robusthed Dvs. kvartalsvise deploys MEN løbende fejlfinding i data og i kommunikationen med integrationssystemerne

Overvågning af PEM Krav om reaktionstid indenfor 15 minutter ved problemer Ønske om at kende problemerne før kunden ITD har 24x7 overvågning, der ringer til PEM-vagten ITD overvåger specifik log fil på produktionsmiljøet ved hjælp af Tivoli software PEM applikationen logger følgende til den overvågede log fil: Hardcoded kendte problemer Et filtreret udsnit af uforudsete logninger fra log4j

PEM Applikationen PEM er en J2EE applikation, der afvikles på en Trifork applikationsserver med Oracle som database Der anvendes log4j frameworket til logning

Udfordringer med filtreringen Filtreringen var hardcoded og inkluderede alle logninger, der stammede fra java.sql.sqlexception Dette viste sig for Grovkornet, da vi ikke behøvede at håndtere alle sql-exceptions manuelt Ufleksibelt, når vi ønskede at ændre filtreringen og ikke lige kunne deploye en ny version af vores applikation

Krav til filtreringen Muligt at kunne konfigurere filtreringen dynamisk (ligesom log4j) Muligt, uden at lave et nyt xml-sprog, at være præcis angående den ønskede filtrering Dvs. vi ville gerne dynamisk/runtime kunne loade en scriptbar filtrering

Log4j <root> <priority value ="info" /> <appender-ref ref="dependent_monitored" /> </root> <appender name="dependent_monitored" class="dk.acure.pem.util.log4j.eventdependentappender"> <param name="isgroovy" value= ToMonitoredLog"/> <appender-ref ref="async_monitored" /> </appender>...

Log4j Appender public class EventDependentAppender extends AppenderSkeleton implements AppenderAttachable { public void append(loggingevent event) { synchronized(aai) { if (toappenders(event)) { Enumeration e = getallappenders(); while (e.hasmoreelements()) { Appender appender = (Appender)e.nextElement(); appender.doappend(event); public void setisgroovy(string groovyscriptname) {

Hardcoded java filtrering (*.java) package dk.acure.pem.services.v2.util; import org.apache.log4j.spi.loggingevent; public class ToMonitoredLog implements EventDependentAppenderDecideInterface { private LogTargetHelper lth = new LogTargetHelper(); public boolean toappenders(loggingevent event) { if (event.getthrowableinformation()!= null) { Throwable t = event.getthrowableinformation().getthrowable(); if (t!= null) { return lth.isthrowabletype(t, java.sql.sqlexception.class); return false;

Groovy filtering (*.groovy) import org.apache.log4j.spi.loggingevent; public class ToMonitoredLog implements EventDependentAppenderDecideInterface { private LogTargetHelper lth = new LogTargetHelper(); public boolean toappenders(loggingevent event) { if (event.getthrowableinformation()!= null) { Throwable t = event.getthrowableinformation().getthrowable(); if (t!= null) { return lth.isthrowabletype(t, java.sql.sqlexception.class); return false;

En Groovy filtrering private LogTargetHelper lth = new LogTargetHelper(); public boolean toappenders(loggingevent event) { if (event.getthrowableinformation()!= null) { Throwable t = event.getthrowableinformation().getthrowable(); if (t!= null) { return ((lth.isthrowabletype(t, java.sql.sqlexception.class)) &&!((t.getmessage().indexof("closed Connection") > -1) && (containsstr("clob.length", event.getthrowableinformation().getthrowablestrrep())))); return false;

Dynamisk load af Groovy script // groovyroots is the folder containing groovy script files GroovyScriptEngine mygse = new GroovyScriptEngine(getGroovyRoot()); // load the current instance of the groovy file as a java class Class myjavafromgroovyclass = mygse.loadscriptbyname(getscriptname()); // create instance of a non-jvm classloaded class. Object groovyinstance = myjavafromgroovyclass.newinstance(); // Cast and use the instance EventDependentAppenderDecideInterface edadigroovy = (EventDependentAppenderDecideInterface)groovyInstance; edadigroovy.toappenders(event);

Opsamling Ønske om dynamisk load af Java lignende script, kan løftes af Groovy Ikke fortalt om: Performance/caching af loaded script Unittest Anvendelse af et dynamisk sprogs muligheder Sikkerhed ved dynamisk loaded kode Scripts i klar tekst adgangskontrol til folderen Versionsstyring, nemt at ændre uden deploy Flere versioner af samme klasse loaded i classloaderen /applikationen. Andre måder at integrere Groovy og Java

Referencer http://groovy.codehaus.org/ - Groovy home http://groovy.codehaus.org/embedding+groovy http://www.ibm.com/developerworks/java/library/ j-alj08034.html

Groovy eksempel fra Eclipse package dk.sigmat.test.groovy; import groovy.util.groovyscriptengine; public class GroovyRunner { public static void main(string[] args) { GroovyRunner runner = new GroovyRunner(); try { runner.run(); catch (Throwable e) { e.printstacktrace(); @SuppressWarnings("unchecked") private void run() throws Throwable { // groovyroots is the folder containing groovy script files GroovyScriptEngine mygse = new GroovyScriptEngine(getGroovyRoot());// IOException // load the current instance of the groovy file as a java class Class myjavafromgroovyclass = mygse.loadscriptbyname(getscriptname());// ResourceException, ScriptException // create instance of a non-jvm classloaded class. Object groovyinstance = myjavafromgroovyclass.newinstance();// InstantiationException, IllegalAccessException // Cast to at java interface or super class and use the instance Runnable HelloWorldGroovy = (Runnable)groovyInstance; HelloWorldGroovy.run(); private String getscriptname() { return "HelloWorld";