SigmaT.

Relaterede dokumenter
Databaseadgang fra Java

Prepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC.

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

Dag 10 Flertrådet programmering

I profil-feltet kan imastra-kunder vælge om upload skal ske ligesom filerne var indsendt til mailboksen eller

Hvordan vælger jeg dokumentprofilen?

Eksempel på en database: studenter, kurser, eksamener

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

Geografisk lokalisering i JSP

Singleton pattern i Java

RMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.

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).

Dag 10 Flertrådet programmering

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

Ugeseddel 4 1. marts - 8. marts

Serialization i Java

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

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

9.8 Kildekode. side 88. Pakke Klasse Sidenummer. fortsætter..

Videregående programmering i Java

Løsning af møntproblemet

BRP Kursusintroduktion og Java-oversigt

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 13/ Side 1 af 7

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

Send fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende fra 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

Forelæsning Uge 3 Mandag

Logging i Java. Den forudsætter kendskab til Java og noget generel udviklings erfaring. Denne guide er oprindeligt udgivet på Eksperten.

Find største element, sæt det på sidste plads. Grundidé i hobsortering. er er

Introduktion til ActionScript, fortsat

public Set(int size) { this.listelement = new LinkedList<Integer>(); }

Dvs. at give dit program muligheden for at loade og bruge plugins som andre har lavet.

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

Datalogi OB, Efterår 2002 OH er, forelæsning 3/ forstå datastrukturer og algoritmer (teoretisk forståelse og intuition)

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Forelæsning Uge 5 Mandag

SAX Simple API for XML.

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

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

Anvendelse af metoder - Programmering

Vejledende løsninger

Forelæsning Uge 6 Mandag

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

Java Klasse nedarvninger

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

Overblik. Class Loader. Java. Class Libraries. Bytecode. Verifier Java. Source (.java) Just in Time Compiler. Java

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

Parallelle algoritmer

Videregående programmering i Java

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

DM502. Peter Schneider-Kamp

Web- og serverprogrammering

Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.

Eksempel: Skat i år 2000

Model Drevet Design i Praksis

02101 Indledende Programmering Introduktion til Eclipse

DANMARKS TEKNISKE UNIVERSITET

SOSI STS Dokumentationsoverblik

Fundamentale sprogbegreber

Webserverprogrammering

Nye features i Java 1.7/7.0

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater

software bricks & glue for system integration

Introduktion til NAnt

Perspektiverende Datalogi Internetalgoritmer. MapReduce. Gerth Stølting Brodal

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.

Skriftlig eksamen i Datalogi

Forelæsning Uge 2 Torsdag

SAS USER FORUM DENMARK 2017 USER FORUM. Rune Nordtorp

Kursus navn: Indledende programmering Kursus nr

Sekvenser af længde mellem 1 og 4 ord repræsenteres ved en klasse Segment, som uden grundlæggende ser således ud:

Objektorienterede metoder

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

Real-time programming safety in Java and Ada

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

Singleton pattern i C#

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

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

SWC Elementer i klassedefinition

ODIN-webservice ændringer release 2010 v2.0

Skriftlig eksamen i Datalogi

Nye Java XML API'er

Certificate Revocation Authority. Certificate Revocation Authority

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

Introduction til.net remoting i C#

Forelæsning Uge 5 Mandag

Introduktion til Flash, fortsat

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";