Archív kategorie 'Programování'

Traktát o vzdělání programátorově

Saturday, August 21st, 2010

Po sadě technických článků bych rád napsal zase jeden trošku filozofického charakteru. Rád bych se v něm zamyslel nad způsoby, které používám pro své vlastní vzdělávání a faktory, které osobně vnímám jako pozitivní. Snad každému je jasné, že ten kdo na sobě dál nepracuje může v našem oboru těžko dlouhodobě něco dokázat (a být lépe placen ;-) ) a proto se zamyšlení nad tím, jak se vzdělávat co nejefektivněji, určitě hodí každému.

Článek je zcela subjektivní – co funguje pro mně nemusí nutně fungovat stejně ve vašem případě, nicméně řekl bych, že základní linka je obecně přenositelná. Způsobů jak se vzdělávat je několik, každý z nich nás obohacuje jiným způsobem a všechny dohromady působí v synergii. Myslím, že pokud člověk libovolný ze jmenovaných způsobů nepoužívá, zbytečně se o mnoho připravuje.

(more…)

When does your Spring @Transactional attribute apply on CgLib proxies

Tuesday, August 10th, 2010

Testing transactional aspect of your application is not easy as we usually use Springs’ transaction rollback on tear down testing approach. Though there are solutions to test aspect oriented logic it’s not without a price. More than that – we very much got used relying on easy-to-use Spring @Transaction annotation so that we don’t usually take an effort to do it. There is a few standard Spring rules for rollbacking transaction in relation to method resolution:

  • transaction is automatically rollbacked only on unchecked exeption (RuntimeException)
  • rollback will also occur for exception types specified in rollback-for attribute of the annotation or XML element
  • rollback will not occur for exception types specified in no-rollback-for attribute of the annotation or XML element
  • transaction demarcation will aplly only to the external calls of the bean method (consider use-case when external logic calls a public method on your bean, that is not annotated with @Transactionaidl and this method will call in its body another public method of the same class that has @Transaction annotation – in such case Spring will not start and manage transaction)

But there is yet another one – your @Transactional annotation must be resolved by Spring bean post processing logic in the first place. Usually it is, but when using CgLib based proxies (proxy-target-class) there is a catch which will cause omitting @Transactional annotation on your method declaration.

(more…)

Jak jednoduše simulovat v testech HTTP server

Thursday, July 8th, 2010

Pavel Jetensky

O autorovi: Jetyho blog | LinkedIn

Pavel Jetenský se věnuje Java/J2EE vývoji již od roku 2003, z toho několik let v Irsku. Zajímají ho techniky automatického testování. V současné době pracuje jako metodický vedoucí Java/J2EE v Deltax Systems a.s.

Občas při tvorbě automatických testů potřebujeme otestovat funkcionalitu, která stahuje nějaká data z Internetu. V mém případě to byla funkce na stahování seznamu zneplatněných certifikátů (CRL). Původně jsem měl automatický test napsaný tak, že se seznam skutečně stahoval. To bylo nevýhodné ze dvou důvodů:

  • test nefungoval bez připojení k internetu
  • těžko šlo ovlivnit v rámci testu stahovaná data

Napsal jsem si tedy jednoduchou implementaci HTTP serveru, která publikuje soubory z classpath pod stejnou relativní cestou na localhost adrese. Např. soubor s CRL umístěný v src\test\resources\crl\emptyCrl.crl je po spuštění serveru ke stažení na:

http://localhost:8001/ResourcePublishServer/crl/emptyCrl.crl

(more…)

jOpenSpace 2010

Tuesday, June 8th, 2010

Opět po roce proběhla – v pořadí již třetí – ne-konference nesoucí název jOpenSpace. Na ní se každoročně setkávají zajímaví lidé z celé republiky, které spojuje jediné téma a tím je Java a vývoj aplikací. Základem konference jsou tzv. lightning talky, což jsou mini-přednášky na vybraná témata. Některá z nich se mi podařilo nahrát a v tomto článku je dávám se svolením autorů ke stažení ve formě podcastů. Kromě toho, že některé z nich obsahují skutečně velmi zajímavé informace, je na nich lákavé především to, že s nimi neztratíte moc času – jejich délka se pohybuje do 6 do 25 minut. Takže neváhejte a stahujte …

(more…)

Názvy argumentů metod v reflexi

Monday, April 26th, 2010

Člověk neznalý věci by mohl nabýt dojmu, že přes reflexi v Javě půjdou získat všechny informace, které se v signaturách tříd a metod nacházejí. Reflexe v Javě je skutečně velmi mocná, nicméně k některým informacím se nedostává jednoduše (jak jsme si ukázali v minulém článku) a k některým se bohužel nedokážete dostat vůbec. Do té posledně jmenované kategorie právě patří názvy argumentů metod. A právě o nich se chci dnes rozepsat.

(more…)

Oříšek v reflexní analýze generik

Friday, March 19th, 2010

Minulý týden jsem řešil zajímavý problém s reflexí a došel jsem k závěru, že generiky v reflexním API jsou opravdu velká legrace. Prototypoval jsem myšlenku automatického generování implementací nad obecným kontejnerem – dejme tomu Map (což není pro účely tohoto článku zase až tak důležité), a došel jsem k potřebě správně číst generické informace z deklarací tříd. Právě této, na první pohled jednoduché, věci, bych chtěl věnovat dnešní článek.

(more…)

Vyhodnocení iBatis 3 Workshopu

Friday, March 5th, 2010

Tento týden proběhl workshop na téma iBatis 3 v Národní technické knihovně. Na workshopu jsem vyhlásil soutěž o licenci vývojového prostředí IntelliJ Idea 9 – Ultimate Edition a v tomto příspěvku najdou soutěžící jak moji verzi řešení příkladů, tak i výsledné vyhodnocení. Kompletní řešení všech testů, které jsme v průběhu workshopu probírali najdete v GitHub repository na stejném místě jako původně (stačí si “pullnout” novou verzi zdrojových kódů):

Sponzor přednášky:

Děkuji ještě jednou všem, kdo si našli cestu na seminář a kdo se i po něm za mnou zastavili a řekli mi svůj názor na jeho formu a průběh (speciální díky patří chlapcům z MoroSystems za jejich příspěvek na blogu). Není totiž horší pocit než, když se jako přednášející dobu potíte vedle projektoru, pak se publikum potichu rozuteče a vy odcházíte z rozpačitým pocitem a otázkou, jestli to nakonec mělo smysl. Jsem rád, že, pokud nic jiného, tenhle workshop nějaké emoce vyvolal a ke konci za mnou zašlo hodně lidí, a měl jsem šanci si udělat obrázek o tom, jestli jsem to vzal za ten správný konec.

(more…)

Pozvánka na CZJUG Workshop věnovaný iBatis 3

Saturday, February 20th, 2010

Rád bych vás všechny pozval na workshop na téma iBatis 3 konaný 3. března 2010 od 18 hodin v rámci CZ JUG setkání (pozor tato praktická setkání se konají v Národní technické knihovně v Praze – Dejvicích – viz. mapka dole). iBatis je framework pro mapování dat uložených v relační databázi na Java objekty. Už po několik let je zajímavou alternativkou k ORM frameworkům postaveným na JPA (jehož typickým představitelem je Hibernate). Mottem iBatisu je zjednodušit vývojářům práci s databází a přitom zůstat tak jednoduchý, jak jen to je možné. Právě jednoduchostí a nízkoúrovňovým přístupem k databázi si získal celou řadu vývojářů a v řadě případů poráží i daleko silnější frameworky.

Na workshopu si budete moci sami vyzkoušet práci s iBatisem 3, který právě spatřil světlo světa. Kromě novinek v iBatisu bude k vyzkoušení jeho integrace do Spring Frameworku 3.1. Obě dvě záležitosti ještě nemají své stabilní verze, takže budou k vyzkoušení opravdu žhavé novinky. V průběhu bude vyhlášena soutěž o jednu licenci vývojového prostředí IntelliJ Idea 9 Ultimate Edition, kterou věnovala společnost JetBrains.

(more…)

Commons DBCP industriální standard s chybami

Sunday, February 7th, 2010

V rámci zátěžových testů, které jsem v minulém týdnu prováděl jsem přišel na jednu zajímavou věc. Při velké zátěži došlo k “zaseknutí” Tomcatu, ze kterého se systém již nedokázal zotavit. Průvodním jevem byly otevřené konekce na databázi, přes které neprocházely žádné dotazy (tj. databáze nic nedělala), nulové zatížení procesoru Tomcatem, žádné Exception v logu. Příznaky nasvědčovaly tomu, že problém vězel v nějakých deadloccích – buď při práci s konekcemi do databáze nebo mezi aplikačními vlákny.

Po nějaké době nikam nevedoucího pátrání v našem kódu jsem si napsal jednoduché wrappery nad DBCP DataSourcem a vracenou Connection, ve kterých jsem si ukládal stacktrace threadu i odkaz na vlastní thread, který si konekci z DataSourcu vybíral. Dál jsem zavedl monitor toho, zda thready používají vždy pouze jedinou connection a nesnaží se získat další, pokud ještě tu původní nevrátily (to by mohla být cesta k deadlockům).

Při opětovném nasimulování problému mi monitor vypsal krásných 50 (tj. maximum poolu) vláken čekajících na uvolnění zámku s nasledujícím stacktracem (uvádím pouze pár nejdůležitějších řádků):

at org.apache.commons.pool.impl.GenericKeyedObjectPool.returnObject (GenericKeyedObjectPool.java:870)
at org.apache.commons.dbcp.datasources.KeyedCPDSConnectionFactory.connectionClosed (KeyedCPDSConnectionFactory.java:268)
at com.mysql.jdbc.jdbc2.optional.MysqlPooledConnection.callListener (MysqlPooledConnection.java:209)
at com.mysql.jdbc.jdbc2.optional.ConnectionWrapper.close (ConnectionWrapper.java:857)
at com.mysql.jdbc.jdbc2.optional.ConnectionWrapper.close (ConnectionWrapper.java:480)

(more…)

MySQL nebezpečí průtokových tabulek, zamyšlení nad insert into … select from

Tuesday, February 2nd, 2010

Je to asi rok co jsem psal článek o implicitních commitech při provádění DDL příkazů. Řešil jsem tehdy problém velmi složitého selectu, který se výrazně zjednodušil, pokud jsem jej rozdělil na dvě části s uložením mezivýsledků. Jelikož jsem potřeboval zachovat transakčnost, nemohl jsem využít temporárních tabulek a šel jsem cestou stálé tabulky s aplikačním hashem rozlišující mezivýsledky jednotlivých transakcí mezi sebou. To jsem ještě netušil, jaké mi to přinese komplikace …

(more…)