Category Archives: java

Spring batch exception

Il est possible de configurer un batch spring pour ne pas s’arrêter lorsqu’il rencontre un certain type d’exception en paramétrant les skyppables exceptions.spring batch chunk

Exception dans un reader

Non skyppable exception
Le batch s’arrête avec un statut en erreur.

Skyppable exception
J’ai fait le test en levant une exception dans un rowmapper.

  • la ligne ayant générée l’exception n’est pas traitée
  • les autres lignes sont traitées normalement

Exception dans un writer

Non skyppable exception
Le batch s’arrête avec un statut en erreur.

Skyppable exception
Le writer traite une ensemble d’items en fonction du paramètre commit-interval.
Lorsqu’une exception skyppable est levée dans un writer, le traitement par lot du writer s’arrête et la transaction est rollbackée.
Chaque élément du lot va être retraité séparément pour permettre d’exclure le fautif. Pour cela, le writer est ré-exécuté et reçoit les items un à un (comportement équivalent à commit-interval= »1″).
Ceci se produit même si le writer traite qu’un seul élément (commit-interval= »1″ par exemple) ou un seul élément à traiter dans le batch.

Exemple de jsonp avec Jersey

Only code ;)

Pom.xml

<jersey.version>1.17.1</jersey.version>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>${jersey.version}</version>
</dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>${jersey.version}</version>
</dependency>

Webservice.java

    @GET
    @Produces("application/javascript; charset=UTF-8")
    public JSONWithPadding listAll(@QueryParam("callback") String callback) {
        Collection<RealProperty> properties = serviceRealProperty.listAll();

        Collection<RealPropertyTo> rpt = mapper.mapAsList(properties, RealPropertyTo.class);

        return new JSONWithPadding(rpt, callback);
    }

Le classpath

Le contenu de cet article est principalement issu de la présentation Le classpath n’est pas mort, mais presque de Alexis Hassler à Devoxx France 2013.

Pour commencer, il existe deux types de classes :

  • classes du JRE (String, Integer par exemple)
  • classes provenant de librairies externes ou du code de l’application

Une classe est identifiée par son nom et par son classloader. Pour toutes les classes n’étant pas dans le JRE, il faut indiquer au lancement de l’application le classpath à utiliser. Si le classpath est erroné deux exceptions peuvent être levées : NoClassDefFoundError et ClassNotFoundException.

Qu’est ce qu’un classloader

Un classloader est avant tout une classe qui est capable de charger une autre classe ou des ressources (properties, xml, images …)

Lorsque le runtime java a besoin de charger une nouvelle classe pour une application, il la recherche dans l’ordre suivant :

  1. Bootstrap classes via le bootstrap classloader : le cœur de la JRE (rt.jar), l’internationalisation (i18n.jar) et bien d’autres
  2. Installed extensions via l’extension classloader : classes présentes dans le dossier lib/ext de la JRE. A ne pas confondre avec le mécanisme d’endorced.
  3. System classes via le system classloader : classes de l’application ainsi que de ses librairies

Tous les classloader (sauf le bootstrap) possède un parent.
Pour connaitre le classloader d’une classe :

MaClasse.class.getClassLoader() // sun.misc.Launcher$AppClassLoader
String.class.getClassLoader() // null

Le classloader des classes du JRE (bootstrap classloader) n’est pas un composant java. Si le bootstrap classloader était un objet Java, il lui faudrait un classloader à qui il faudrait également un classloader …
Le bootstrap classloader est donc un bout de code natif. Lire la suite »

Java SE, Java EE, JDK, JRE, OpenJDK quelles différences ?

Java SE

Java SE est une spécification dont l’implémentation la plus connnue est le JDK d’Oracle. Java SE contient les classes et concepts de bases de la plateforme Java. Chaque version du JSE contient :

JavaSE_Software_ArchitectureImage provenant de Wikipedia.

Java EE

Java EE (Enterprise Edition) est une spécification. Elle comprend entre autres :

  • Servlet
  • JSTL,
  • JPA
  • JMX
  • JSF
  • EJB
  • JTA
  • JAX-RS

Les serveurs d’applications (Glassfish, JBoss, Tomcat …) sont les implémentation concrètes de cette spécification.

BalusC de stackowerflow :

Your Glassfish server is the concrete Java EE implementation. Note that OpenJDK is
a concrete Java SE implementation. Also note that whenever you download Java EE
from Oracle site, basically all you get is Glassfish along with a bunch of
documents and examples.

Lire la suite »

JPA et @Transactional readonly (spring)

Petite subtilité avec l’attribut readonly de l’annotation @Transactional de Spring lors de l’utilisation de JPA.

@Transactional(readOnly = true)
    public void save(T bo) {
        entityManager.persist(bo);
    }

Lorsque vous utilisez JPA, deux possibilités lors de l’exécution de ce code :

  1. L’insertion en base s’effectue malgré le flag readonly
  2. Rien ne se produit (même pas une exception)

Le premier cas se produit lorsque la clé technique de l’entité à persister est générée automatiquement. Le deuxième cas intervient quand la clé technique de l’entité à persister est assignée par l’application.

Pour les explications vous pouvez consulter le lien suivant : http://www.ibm.com/developerworks/java/library/j-ts1/index.html#N101B1