Guillaume VIEL :: blog Openfarm :: java jee tomcat linux

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 7 mars 2013

tunnel IPv6 sous linux debian

Pour avoir un accès IPv6 de chez soi sans avoir de box ou routeur en IPv6, il faut faire appel à un IPv6 tunnel broker (si possible gratuit). Voici comment je procède avec Hurricane Electric (car mon wifi ne veut entendre parler de l'IPv6)...

Lire la suite...

mercredi 6 mars 2013

cloner une VM sous Proxmox

L'interface d'administration de proxmox permet de créer, détruire, modifier, migrer une VM. Mais l'interface ne permet pas de cloner la VM. Voici comment j'ai procédé :

Lire la suite...

vendredi 27 avril 2012

vi commenter un bloc de code

Après avoir essayé plusieurs trucs, j'ai enfin trouvé une solution intéressante pour commenter un bloc de code sous vi qui ne propose pas du mode visuel. Bien qu'intéressant quand on est sous vim, lorsqu'on est sur un serveur sur une configuration Apache, les choses sont tout de suite moins visuelles... L'idéal est d'utiliser les markers et la substitution :

  1. se placer sur la première ligne du bloc de code et taper
    ma
    
    pour placer le marqueur a
  2. positionner le curseur sur la dernière ligne du bloc à commenter
  3. du marqueur a ('a) à la ligne courante (.) remplacer chaque début de ligne par un # :
    :'a,.s/^/#/
    

Et voilà!

mardi 31 janvier 2012

Log4j : changer le niveau de log à chaud via JMX

Changer le niveau de log directement sans avoir à redéployer l'application est parfois indispensable sur des plateformes critiques où il est impossible d'interrompre le service. C'est aussi un moyen de déboguer directement sur une plateforme qui est la seule à présenter un bug non reproductible ailleurs.

Il existe plusieurs solutions dont :

  • relecture de la configuration Log4j à intervalle régulier; il suffit alors de modifier la configuration des niveaux de log directement (soit avec l'API Log4j, soit avec les classes utilitaires de Spring Log4jWebConfigurer)
  • changement des niveaux de log à l'aide de JMX

C'est cette dernière solution que je préfère, car il est généralement déconseillé de modifier directement des fichiers à chaud dans un serveur d'applications.

Il faut d'abord créer une classe avec une méthode permettant de modifier le niveau de log de n'importe quel package :

Lire la suite...

mercredi 4 janvier 2012

Log4j avec Spring et applications multiples dans Tomcat

Je déploie habituellement les applications web dans Tomcat en multi-instance avec une instance Tomcat par application (ceux qui croient que c'est une hérésie iront voir les concepteurs de Tomcat Mark Thomas et Filip Hanik qui préconisent eux mêmes cette solution). Cependant, dans certains contextes, et notamment chez certains clients, les contraintes font que l'on est obligé de faire autrement...

Dans le cas présent, c'est la configuration de log4j via Spring qui pose (encore) problème : je déploie 2 applications identiques (avec configuration applicative légèrement différente) sous 2 contextes différents dans le même serveur Tomcat. Se posent donc 2 problèmes :

  • il faut pouvoir packager l'application sous des formes différentes et notamment 2 contextes différents : /my-app1 et /my-app2, donc paramétrer le packaging
  • la configuration log4j est à priori identique pour ces 2 applications (packages identiques) : ceci pose le problème de la séparation des logs (et éventuellement la différenciation des niveaux de log)

Lire la suite...

vendredi 18 novembre 2011

commande find : trouver les derniers fichiers modifiés à partir d'une certaine date

La commande find est très puissante mais il faut parfois creuser un peu pour trouver la bonne syntaxe...

Pour trouver tous les fichiers réguliers modifiés dans les dernières 24 heures dans un répertoire et ses sous-répertoire voici la commande :

find /mydir -type f -mtime -1 -print

Pour trouver tous les fichiers réguliers modifiés à partir du début de la journée dans un répertoire et ses sous-répertoire il faut ruser un peu...

On créée d'abord un fichier factice à l'aide de la commande touch en forçant la date de ce dernier :


$ touch -t `date +%m%d0000` /tmp/$$
$ ls -l /tmp/
-rw-r--r-- 1 moi moi 0 2011-11-18 00:00 5992
$ find /mydir -type f -newer /tmp/5992
$ rm /tmp/5992

En effet dans la documentation de la commande touch on lit ceci sur l'option -t :

 -t STAMP        use [[CC]YY]MMDDhhmm[.ss] instead of current time

Il est donc ensuite très facile d'étendre la commande précédente pour lui faire rechercher des fichiers après n'importe quelle date.

mardi 27 septembre 2011

OFBiz : affichage d'une chaine HTML avec Freemarker

Lorsqu'on doit inclure du code HTML généré dans une page freemarker (sous la forme d'une chaîne), il faut utiliser cette syntaxe pour que les tags HTML ne soient pas "échappés" :

${StringUtil.wrapString( htmlString ? if_exists ) }

htmlString étant une chaine qui aura par exemple été mis dans le contexte via un script grovvy ou un service.

mardi 23 août 2011

Audit des requêtes SQL Hibernate

Obtenir les traces des prepared statements d'Hibernate est assez simple et tout le monde connaît cette configuration. Il suffit d'indiquer

hibernate.show_sql=true

dans le fichier de configuration XML Hibernate pour obtenir la requête qui sera utilisé avec le SGBD. La requête sera affichée sous la forme d'un preparedStatement avec des "?" à la place des valeurs.

Une question alors fréquemment posée est : comment obtenir aussi les valeurs passée avec la requête?!

L'information est quelque part connue en interne dans Hibernate : le tout est de la mettre en valeur en modifiant le paramétrage du logger. Par exemple avec log4j il suffit de mettre en level DEBUG les packages suivants et de les router vers un appender spécifique avec une additivité à false :

log4j.logger.org.hibernate.SQL=DEBUG,SQL_APPENDER
log4j.additivity.org.hibernate.SQL=false
org.hibernate.type=DEBUG,SQL_APPENDER
log4j.additivity.org.hibernate.type=false

mardi 3 mai 2011

bzip2 gzip tar avec stdin et stdout

Dans les scripts shell, il est toujours utile de savoir manipuler correctement les commandes courantes de compression comme bzip2, gzip et tar, et notamment leurs interactions possibles avec l'entrée standard (stdin) et la sortie standard (stdout). L'avantage d'utiliser cette méthode est qu'elle est compatible avec tous les systèmes *NIX !

Créer des archives

On utilise l'option c(reate) de tar dont le résultat est envoyé dans un pipe vers gzip ou bzip2. La redirection > permet d'envoyer le résultat final dans un fichier :

   tar cv file1 [file2] ... | gzip > archname.tar.gz
tar cv file1 [file2] ... | bzip2 > archname.tar.bz2

Décompacter des archives

   gzip -cd archname.tar.gz | tar xv
bzip2 -cd archname.tar.bz2 | tar xv

Lire le contenu d'une acrhive

   gzip -cd archname.tar.gz | tar tv
bzip2 -cd archname.tar.bz2 | tar tv

NOTA BENE

Le programme tar peut parfois pointer par défaut sur un device prédéfini (comme un magnéto à bande) si l'option f n'est pas précisée. Sur certains systèmes il faut donc préciser f - pour forcer tar à orienter vers l'entrée / sortie standard. Exemple :

tar cvf - file1 [file2] ... | gzip > archname.tar.gz

mercredi 2 mars 2011

Maven récupération du code source et de la javadoc

Pour récupérer les codes sources et la javadoc, il suffit d'ajouter au lancement de maven

-DdownloadSources=true -DdownloadJavadocs=true

ou bien ceci dans le pom.xml

<properties>

<downloadSources>true</downloadSources>

<downloadJavadocs>true</downloadJavadocs>

....

</properties>

Il est utile d'avoir les sources lors des phases de debugging pour comprendre parfois le comportement d'un framework.

mardi 22 février 2011

Message Bundle avec Spring et problèmes d'encodage des fichiers de properties

Sur une application destinée à l'international, j'ai tout naturellement souhaité introduire l'internationalisation (i18n) des messages destinés aux utilisateurs, aux logs, aux erreurs etc.

Je me suis penché sur ce que propose Spring et j'ai commencé avec cette configuration très sommaire :

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="message"/>
</bean>

Le premier problème c'est l'apparition de ??? à la place de certains caractères UTF-8 : gênant non?! Ceci est en fait dû au ResourceBundleMessageSource de Spring qui utilise les classes standards java.util.ResourceBundle et java.util.Properties, or ces dernières ne supportent visiblement que l'encodage ISO-8859-1 !!!

La solution est d'utiliser le ReloadableResourceBundleMessageSource de Spring, plus complet. Il suffit de lui indiquer le defaultEncoding choisi.

L'autre problème est la non reconnaissance des fichiers de properties (mis dans le classpath) que j'ai nommés message_en.properties , message_fr.properties, etc. Apparemment il faut ajouter le paramètre fallbackToSystemLocale=false sur le ReloadableResourceBundleMessageSource de Spring pour éviter que soient recherchés les fichiers du type message_fr_FR ou message_en_FR.

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:message"/>
<property name="fallbackToSystemLocale" value="false" />
<property name="defaultEncoding" value="UTF-8"/>
</bean>

Sources :

http://www.cakesolutions.net/teamblogs/2009/04/02/utf-8-encoding-and-message-sources/

http://forum.springsource.org/showthread.php?t=18199&page=2

jeudi 17 février 2011

Données utilisateur visualVM

Lors d'un changement de JVM, il se peut que les données de configuration VisualVM ne soient pas récupérées (notamment passage de Java 6 à Java 7). Sur un poste windows, il est très simple de récupérer ses configurations d'hôtes à monitorer. Elles se trouvent dans :

C:\Documents and Settings\utilisateur\Application Data\.visualvm\6u30

Les hôtes déclarés sont dans le répertoire repository. Il suffit de recopier les données vers le répertoire C:\Documents and Settings\utilisateur\Application Data\.visualvm\7u4 si vous venez d'installer la dernière JVM 7.

D'une version 6 à une autre, le premier répertoire créé semble être conservé pour les versions suivantes.

mercredi 16 février 2011

Problème avec le Maven archetype plugin

Lors d'un test de l'archetype plugin de maven, j'obtenais un build failure avec un Required goal not found alors que tout fonctionnait auparavant...

Voici le contenu du .m2\repository\org\apache\maven\plugins\maven-archetype-plugin\maven-metadata-central.xml

<?xml version="1.0"?><metadata>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<versioning>
<latest>1.0-alpha-4</latest>
<release>1.0-alpha-4</release>
<versions>
<version>1.0-alpha-3</version>
<version>1.0-alpha-4</version>
</versions>
<lastUpdated>20060507072802</lastUpdated>
</versioning>
</metadata>

En fait, il faut le corriger comme ceci pour que tout fonctionne correctement (en téléchargeant directement sur un repository en ligne le fichier maven-metadata.xml)

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<versioning>
<latest>2.0</latest>
<release>2.0</release>
<versions>
<version>1.0-alpha-3</version>
<version>1.0-alpha-4</version>
<version>1.0-alpha-7</version>
<version>2.0-alpha-1</version>
<version>2.0-alpha-2</version>
<version>2.0-alpha-3</version>
<version>2.0-alpha-4</version>
<version>2.0-alpha-5</version>
<version>2.0</version>
</versions>
<lastUpdated>20101028011818</lastUpdated>
</versioning>
</metadata>

Et voilà!

Archetype maven et quickstart pour spring batch

Les archetypes maven ne semblent pas très fonctionnels... Pour créer un template de projet à partir d'un archetype existant voici la commande à exécuter :

$ mvn archetype:generate
Maven sort alors une liste d'une vingtaines d'archetypes possibles. On peut alors choisir l'archetype à utiliser et le customiser. Maven génère alors un répertoire projet prêt à l'emploi. En les testant on s'aperçoit que sur la majorité des archetypes disponibles, seuls quelques uns fonctionnent vraiment...
La liste des archetypes possibles se trouve ici : http://docs.codehaus.org/display/MAVENUSER/Archetypes+List
C'est un peu décevant...

De même, j'ai cherché un archetype pour Spring-batch. Visiblement rien n'existe et l'infrastructure maven ne semble pas être utilisée pour ça. Le mieux que j'ai trouvé c'est d'aller directement récupérer les exemples de code qui existent sur le repository SVN de spring !

$ svn export  https://src.springframework.org/svn/spring-batch/trunk/archetypes/simple-cli
$ cd simple-cli
$ mvn test

Et voilà! On y trouvera aussi d'autres exemples de projet.



mercredi 15 décembre 2010

Uptime d'un serveur

Pour connaitre le temps d'activité d'un serveur depuis son dernier démarrage, sous Linux, c'est la commande uptime :

# uptime
10:38:26 up 153 days, 19:49, 1 user, load average: 1.18, 0.76, 0.46

Par contre sous windows, c'est un peu plus compliqué, et les calculs sont à faire par vos soins (où alors je n'ai pas trouvé la commande!)... Je n'ai trouvé que ça :

>net statistics serveur
Statistiques de serveur de \\MYSERVER


Statistiques depuis 10/13/2010 10:07 AM


Sessions acceptées 1
Déconnexions automatiques 0
Déconnexions sur erreur 6

Kilo-octets envoyés 8
Kilo-octets reçus 11

Temps de réponse moyen (ms) 0

Erreurs système 0
Violations d'autorisation 12
Violations de mot de passe 0

Fichiers utilisés 0
Périphériques comm. utilisés 0
Travaux d'impression mis en file d'attente 0

Saturation des zones tampon

de grande taille 0
de demande 0

La commande s'est terminée correctement.

mardi 30 novembre 2010

SOAPUI connexion JDBC

Pour réaliser des tests plus industriels, il est nécessaire que le script de test puisse accéder à une base de données. Sur la version non payante de SOAPUI

import com.eviware.soapui.*;
import groovy.sql.Sql;

def dbUrl = "jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = host1.mydomain.com)(PORT = 1523))(ADDRESS = (PROTOCOL = TCP)(HOST = host2.mydomain.com
)(PORT = 1521))(FAILOVER = false))(CONNECT_DATA =(SERVICE_NAME = MYDB.MYDOMAIN.COM)))";
def dbUser = "user";
def dbPwd = "mypassword";
def sql;
try {
sql = Sql.newInstance(dbUrl, dbUser, dbPwd, "oracle.jdbc.OracleDriver");
//def res = sql.firstRow("SELECT * FROM MA_TABLE");
//log.info res.ID + " " + res.CHAMP1;
//res.close();
sql.eachRow("SELECT * FROM MA_TABLE") {
log.info "${it.ID} / ${it.CHAMP1}"
}
sql.close();
log.info "Closed Database Connection.";
} catch (Exception e) {
log.error "Could not establish connection to the database.";
}

Voilà une première étape de franchie. On peut aller plus loin en utilisant ceci au niveau des scripts de setup et tear down d'un jeu de test.

dimanche 7 novembre 2010

Hibernate interceptor : nom de schéma dynamique

Bien d'Hibernate soit capable d'aller chercher des données dans des tables situées dans différents schémas, il n'est pas possible directement de changer le schéma à l'exécution. En effet, les annotations sont lues à  la compilation et le code d'une @Entity est alors figé sur un schéma et une table.

@Entity
@Table(name="MON_OBJET",schema="MON_SCHEMA")
public class MonObjet implements Serializable {
...
private Etat etat;
...
@OneToOne(...)
public Etat getEtat() { ... }
public void setEtat(Etat etat) { ... }
}

@Entity
@Table(name="ETAT",schema="MON_SCHEMA")
public class Etat {
...
}

Ceci devient gênant lorsque par exemple, une des entités peut se trouver dans différents schémas qui correspondent par exemple à des environnements différents. Par exemple, si MonObject est attaché en relation un à un à un objet Etat qui peut se trouver dans MON_SCHEMA, SCHEMA_PREPROD ou SCHEMA_PROD, on devra alors packager une application par schéma!

Une solution possible serait de créer un profile maven pour chaque environnement, puis d'utiliser la phase de génération des sources pour modifier les annotations dans le code java... Ce qui semble plutôt lourd à mettre en place! Et au final, il faut toujours une application par schéma utilisé! Il existe cependant une solution avec les interceptor d'Hibernate pour ne déployer qu'une seule application...

Lire la suite...

mercredi 13 octobre 2010

Tomcat : configuration proxy HTTPS

La configuration d'un proxy HTTPS pour Tomcat est plus cohérente que celle de maven et plus directe; il suffit juste d'indiquer les propriétés système de Java dans le fichier $CATALINA_HOME/conf/catalina.properties :

http.proxyHost=proxy.mydomain.com
http.proxyPort=8080
http.nonProxyHost=localhost|10.*

https.proxyHost=proxy.mydomain.com
https.proxyPort=8080

Maven : configuration proxy HTTPS

La configuration d'un proxy sous maven est a priori simple : il suffit d'ajouter la section suivante dans le fichier ~/.m2/settings.xml :

<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
<host>proxy.somewhere.com</host>
<port>8080</port>
<username>proxyuser</username>
<password>somepassword</password>
<nonProxyHosts>localhost|10.*</nonProxyHosts>
</proxy>
</proxies>

Mais pour le protocole HTTPS la documentation n'indique rien! Si l'on essaye de transposer et d'ajouter un proxy avec
<protocol>https</protocol>
cela ne marche pas beaucoup plus...
La solution consiste à ajouter ceci à la variable d'environnement MAVEN_OPTS :

MAVEN_OPTS=$MAVEN_OPTS -Dhttps.proxyHost=proxy.somewhere.com -Dhttps.proxyPort=8080

lundi 4 octobre 2010

Implémentation d'un Interceptor CXF pour logger le temps d'exécution

Les intercepteurs de CXF permettent, comme leur nom l'indique, d'intercepter le flux en entrée ou en sortie d'un webservice et d'exécuter un traitement. Tout comme les filtres de servlet, ils sont puissant pour réaliser des opérations techniques sur les données.

Si l'on veut tracer le temps d'exécution d'un webservice à toutes les étapes et notamment juste avant l'entrée dans l'implémentation.

Lire la suite...

samedi 2 octobre 2010

Spring AOP advice et pointcut sur Servlet

La puissance de Spring AOP se limite a priori à son contexte (cf ce post http://forum.springsource.org/archive/index.php/t-11673.html )... Les servlets sont hors contexte Spring car gérées par le serveur d'application JEE et semblent exclues du champ de Spring AOP. Cependant, il est tentant de vouloir quand même utiliser Spring AOP sur les servlets sans avoir à passer par d'autres tisseurs d'aspects (comme AspectJ) qui complexifient la configuration du serveur d'application et le déploiement de l'application. Il s'avère que c'est possible par un moyen détourné. Il fallait juste y penser.

Lire la suite...

Spring AOP : trouver le bon pointcut avec la stack trace

Il est parfois difficile d'identifier le bon endroit pour une "coupe" (pointcut), et il ne faut pas perdre de vue qu'une méthode protected ne pourra jamais être interceptée par Spring AOP.

J'ai donc écris ce bout de code pour me faciliter la tâche et identifier plus aisément quelle pourrait être la méthode déclarée en public et donc candidate au pointcut.

Ce code est à placer dans la méthode qui sera appelée en dernier dans le fil d'exécution afin d'avoir une liste complète des méthodes pouvant être interceptée

        // récupération d'une trace de la pile pour notre thread courant
StackTraceElement[] stack = Thread.getAllStackTraces().get(Thread.currentThread());

for(StackTraceElement ste : stack) { // on parcourt la pile
// on parcours la liste de toutes les méthodes pour la classe
// trouvée dans la stack trace et l'on vérifie si la méthode
// utilisée dans la stacktrace est bien publique
Method[] methods = Class.forName(ste.getClassName()).getMethods();
for(Method m : methods) {
if(m.getName().equals(ste.getMethodName())) {
if(Modifier.isPublic(m.getModifiers()) ) {
logger.debug( ste.getClassName() + "." + ste.getMethodName() );
}
}
}
}

vendredi 1 octobre 2010

Erreur classique de JAXB : JAXBException nor any of its super class is known to this context

Cette exception peut se produire lorsque votre webservice contient des objets complexes (objets imbriqués) qui ne sont pas forcément visible dans votre déclaration de service. Pour qu'ils soient pris en compte, la solution est d'utiliser l'annotation @XmlSeeAlso(MyObjectFactory.class, MyOtherObjectFactory.class) sur votre webservice JAX-WS en lui indiquant les fabriques d'objets souhaitées. JAX-B pourra alors fabriquer tous les objets nécessaire au fonctionnement du webservice.

Source : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6419632

lundi 13 septembre 2010

Web services securisés avec CXF et WSS4J (partie 1)

La sécurisation des webservices devient de plus en plus nécessaire dans le monde de l'entreprise. Il y a une époque pas si lointaine, les entreprises ne se souciaient pas trop de la sécurisation de leurs données à l'intérieur de l'entreprise. Or il s'avère que les risques sécuritaires viennent majoritairement de l'intérieur!

Voici donc un tutoriel qui explique comment mettre en place toute l'infrastructure webservice : serveur et client. Nous utiliserons CXF qui nous parait être une des solutions les plus efficaces et maniables. CXF allie performances et simplicité d'intégration avec la plupart des frameworks (Spring et WSS4J).

Lire la suite...

mercredi 1 septembre 2010

Activation des traces du driver JDBC Oracle

Il est parfois utile de comprendre ce que fait le driver JDBC Oracle que les développeurs connaissent sous le nom de ojdbc14.jar. Il existe en fait un autre driver destiné au debug : ojdbc14_g.jar pour lequel il suffit d'ajouter ceci dans les JAVA_OPTS pour activer les traces

JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.config.file=OracleLog.properties -Doracle.jdbc.Trace=true"

Ensuite, un fichier OracleLog.properties doit être placé avec le jar pour configurer les traces souhaitées. Il est conseillé de le modifier sinon vous allez avoir beaucoup de traces...

mardi 24 août 2010

Migration des scripts de démarrage de la Debian vers le LSB (Linux Standard Base)

Récemment j'ai eu la surprise d'avoir cet écran lors d'une mise à jour Debian :

Il suffit de suivre les indications... Arf!

Voici les liens qui pourront vous permettre de réussir votre migration :

Dans mon cas la migration a été très simple :

  • un nettoyage des packages enlevés mais encore configuré avec dpkg --purge package pour enlever les fichiers de configuration (en vérifiant au préalable la liste des fichiers de configuration et s'il faut conserver quelque chose)
  • une mise à jour de mes scripts maison au format LSB
  • la reconfiguration de sysv-rc avec dpkg-reconfigure sysv-rc comme l'indique l'écran d'apt-get
Après ça votre Linux devrait être capable de lancer plusieurs scripts d'init à la fois en parallèle tout en respectant les dépendances entre scripts.

Expressions régulières ou regexp en java

J'ai souvent cherché sur Internet des ressources claires et précises sur les expressions régulières en Java. En voici une qui a le mérite d'être claire, complète, avec des exemples et en français :
http://prevert.upmf-grenoble.fr/Prog/Java/CoursJava/expressionsRegulieres.html

Il y a bien sûr la documentation SUN (oops... Oracle) sur les regexp en java mais je la trouve illisible.

jeudi 8 juillet 2010

AVWorks , Java et IPv6

L'application AVWorks est une application fournie avec les KVM IP d'Avocent et notamment la série des Autoview. Ces anciens KVM IP ne fonctionnent qu'en IPv4. AVWorks est réalisée en Java et il semblerait que la façon dont Sun ait implémenté la dual stack IPv4 / IPv6 dans la JVM est plutôt étrange ( cf. article suivant sur debian et ipv6 )... Surprise donc lorsqu'en passant en dual stack IPv4 / IPv6 sur Debian je me retrouve avec l'application AVWorks et toutes les autres applications java qui ne marchent plus.

J'ai donc cherché à patcher l'application afin qu'elle refonctionne et c'est possible. Voici comment faire :

  1. surtout garder l'ancienne version 2.1 d'AVWorks et ne pas installer la nouvelle version 3.1 qui contient pas mal de bugs
  2. dans le fichier AVWORKS_HOME/Avocent_AVWorks.lax il suffit d'y ajouter la variable d'environnement java "java.net.preferIPv4Stack=true" vers la ligne 68 comme ceci: lax.nl.java.option.additional=-Djava.library.path=AVWORKS_HOME/Avocent_AVWorks -Duser.variant=avct -Djava.net.preferIPv4Stack=true
    (avec AVWORKS_HOME qui doit être remplacé par votre répertoire d'installation d'AVWorks)
Edit :
En fait, après enquête, il s'avère que le dysfonctionnement venait d'un problème plus général lié à la mise à jour de l'OS (i.e. une Debian)... Le paramètre noyau net.ipv6.bindv6only était à 1 !!! Ceci privilégie IPv6 avant tout, d'où les problèmes de java qui cherchait à se connecter en IPv6 avec des adresses IPv4. Pour remédier au problème il suffit de mettre net.ipv6.bindv6only=0 dans le fichier /etc/sysctl.d/bindv6only.conf et de lancer invoke-rc.d procps restart pour faire appliquer la nouvelle configuration.

Sources :

sun-java6-jre: net.ipv6.bindv6only=1 breaks java networking

net.ipv6.bindv6only=1 breaks java networking

ERROR: transport error 202: connect failed: Connection refused


jeudi 3 juin 2010

Chez Openfarm des architectes java certifiés Scrum Master

Ils l'ont fait!

Deux architectes java d'Openfarm sont désormais certifiés Scrum Master :

L'explication de Scrum est ici pour ceux qui ne connaissent pas

lundi 3 mai 2010

Maven comment créer un jar des sources

Il peut arriver que l'on ait besoin de naviguer dans les sources d'un jar fait maison à travers Eclipse. Ce jar fait souvent d'un projet externe au projet courant, mais vous souhaitez pouvoir naviguer ou débugger dans ce code.

Il suffit d'ajouter ceci à votre pom.xml
<project>  ...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>

Ensuite la commande suivante fera l'affaire
$ mvn source:jar-no-fork

La solution se trouve en fait ici avec plus de détails  : http://maven.apache.org/plugins/maven-source-plugin/usage.html

Maven optimiser le déploiement avec un WAR éclaté

Optimiser le temps de déploiement devient parfois crucial pour éviter de perdre des heures... Après avoir tenté des plugins maven (comme cargo par exemple) sans être totalement convaincu par leur efficacité (quand ça marche!), il m'a semblé plus efficace de recourir au script shell.

Maven est idéal pour toutes ces tâches mais nécessite parfois un peu de tuning, notamment lorsqu'on lui demande le packaging de l'application avec le plugin maven-war-plugin. L'opération est laborieuse et nécessite ensuite le déploiement d'un WAR ce qui veut dire que (de façon raccourcie car maven fait plus de choses en réalité) :

  • maven compile l'application
  • Maven copie les classes compilées et les fichiers de ressource dans une structure éclaté (dans le répertoire target)
  • Maven zippe le tout dans un WAR (et c'est long!)
  • ensuite il faut uploader le WAR vers le serveur cible
  • Tomcat ou votre serveur d'application java doit ensuite dézipper l'archive...
Au final vous avez plusieurs opérations couteuses en temps et en ressource. Tout doit être fait manuellement.

Comment accélérer le processus ?

Julien DUBOIS propose sur le blog de Responcia une solution intéressante pour optimiser vos développements avec Jetty. Il apporte la preuve en vidéo que l'on peut améliorer les productivité des développements Java de cette façon. Mais parfois, il n'est pas possible d'opter pour Jetty...

Lire la suite...

mardi 6 avril 2010

Comment mettre à jour une vieille Debian Sarge ?

Souvent, lorsque ça marche bien, on ne touche à rien... Et puis le temps passe, et la distribution Debian vieillit...

Pour pouvoir mettre à jour une sarge il faut mettre comme nom de repository archive.debian.org au lieu de ftp.debian.org
(pour security je ne sais pas)

jeudi 1 avril 2010

Oracle native JDBC connection extractor

L'utilisation d'API Oracle Java, comme par exemple la SDO API (sdoapi.jar) ou Oracle Network Modeling (sdonm.jar) pour gérer les graphes, nécessite d'avoir une connexion native Oracle. Or les applications sont souvent configurées avec un pool de connexions gérées par le conteneur JEE. Ceci pose alors problème pour les opérations spécifiques qui nécessitent d'avoir une connexion de type oracle.jdbc.OracleConnection et non une connexion de type java.sql.Connection. Cette dernière ne pourra en effet pas être utilisée avec les méthodes des API Oracle en Java.

Il faut alors extraire la connexion native sous-jacente à la connexion du pool de connexions.

Lire la suite...

mardi 30 mars 2010

ORA-04061 ô désespoir, ô variable ennemie

Que signifie l'exception ORACLE ORA-04061 ?

Souhaitant rationaliser un projet de plusieurs milliers de lignes de PL/SQL, j'ai rencontré cette exception lorsque nous avons mis en package les procédures et fonctions. L'exception se présente comme suit :

ORA-04061: existing state of package "SCHEMA_REF.MON_PACKAGE" has been invalidated
ORA-04065: not executed, altered or dropped package "SCHEMA_REF.MON_PACKAGE"
ORA-06508: PL/SQL: could not find program unit being called: "SCHEMA_REF.MON_PACKAGE"
ORA-04088: error during execution of trigger 'MON_SCHEMA.MON_TRIGGER'

L'erreur est déroutante au premier abord car le package MON_PACKAGE, une fois compilé, est tout à fait valide et il n 'y a a priori aucune erreur à la compilation d'après ORACLE. Ce n'est qu'à la deuxième exécution (par un tiers) que les problèmes surviennent. Alors que se passe-t-il exactement?

Lire la suite...

samedi 27 mars 2010

FreeNAS Cannot dump. No dump device defined

Lors de la réinstallation de FreeNAS 0.69.2 (downgrade depuis la version 0.7.1) sur carte flash j'obtiens ça :

Cannot dump. No dump device defined.
Automatic reboot in 15 seconds - press a key on the console to abort

Beuh... En fait il s'avère qu'il faille démarrer en mode no ACPI sur le premier menu de démarrage. Le problème est : comment automatiser le démarrage pour que ce soit toujours l'option 2 du boot qui soit prise en compte?

Lire la suite...

vendredi 26 mars 2010

FreeNAS versions 0.7 et 0.7.1 : impossible de monter un volume NFS

Décidément, pas de chance en ce moment... Cascade de bugs... Faut dire que je le cherche un peu, en étant sous Debian SID. Mais là, c'est pas Debian! Nous avons mis à jour notre serveur NAS avec la dernière version de FreeNAS et apparemment quelques soucis sur les montages NFS. En effet, une tentative de connexion donne le message suivant :

mount.nfs: mount to NFS server failed: timed out, giving up

Yuk! Après avoir vérifié le ping, que tous les ports étaient ouverts, une petite trace avec wireshark m'a permis de constater qu'un échange avait bien lieu mais que la connexion entre le client et le serveur n'aboutissait pas. Et il semblerait que je ne sois pas le seul à avoir ce problème vu ce bug sur le bug tracker de FreeNAS

http://sourceforge.net/tracker/?func=detail&aid=2812161&group_id=151951&atid=782616

La meilleure parade est de revenir à la version 0.69.2 en attendant mieux.

jeudi 25 mars 2010

rsnapshot : module Lchown manquant

Nous utilisons rsnapshot pour réaliser nos sauvegardes. En le résinstallant sur une machine je remarque sur le log de sauvegarde le message suivant :

require Lchown
Lchown module not found

Lire la suite...

linux debian squeeze : bug sur la configuration PAM pour CRON

La programmation de tâches par CRON peut se faire de différentes façon, et notamment par l'intermédiaire de fichiers de configuration situés dans /etc/cron.d

En voulant programmer des tâches de sauvegarde rsnapshot avec cron, je constate l'erreur suivante dans mon /var/log/syslog

Mar 24 23:04:01 myhost CRON[8435]: Erreur critique - abandon immédiat
Mar 24 23:04:01 myhost CRON[8435]: PAM pam_end: NULL pam handle passed

ou pour la version originale

Mar 24 23:04:01 myhost CRON[8435]: Critical error - immediate abort
Mar 24 23:04:01 myhost CRON[8435]: PAM pam_end: NULL pam handle passed

Que se passe-t-il ?

Lire la suite...

mercredi 24 mars 2010

Configuration d'un pool de connexions JDBC avec Oracle RAC

La documentation Oracle FCF (Fast Connection Failover) pour configurer un pool de connexion JDBC avec un cluster Oracle RAC 10g est plutôt obscure et manque d'exemple...

Après quelques tâtonnements et en fouillant un peu, voici une configuration sous Tomcat à mettre dans le context.xml de l'application web ou dans server.xml (déconseillé sauf en ressource globale) qui semble plaire à Oracle :

    <Resource name="jdbc/myRacDb" auth="Container"
            type="oracle.jdbc.pool.OracleDataSource"
            factory="oracle.jdbc.pool.OracleDataSourceFactory"
            description="My Oracle RAC DB"
            user="myschema" password="mypass"
            url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac1.mydomain.com)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=rac2.mydomain.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myservice.mydomain.com)))"
            driverClassName="oracle.jdbc.OracleDriver"
            maxActive="10"
            maxIdle="5"
            minIdle="2"
            maxWait="5000"
            connectionCacheName="myCache"
            connectionCachingEnabled="true"
            fastConnectionFailoverEnabled="true"
            onsConfigStr="nodes=rac1.mydomain.com:4200,rac2.mydomain.com:4200"
            connectionProperties="oracle.jdbc.ReadTimeout=30000" />

Cette datasource est accessible via le JNDI sous le nom java:comp/env/jdbc/myRacDb (sous Tomcat).

Le cluster Oracle RAC est ici composé de 2 noeuds rac1.mydomain.com et rac2.mydomain.com. On travaille avec un driver Oracle thin.

Sous tomcat, il faut mettre la librairie Oracle JDBC ons.jar (Oracle Notification Services) dans le common/lib (du moins sous tomcat 5) avec les autres librairies Oracle (ojdbc14.jar et orai18n.jar notamment).

Afin de ne pas avoir d'ennuis, il est obligatoire de mettre l'attribut nodes dans l'onsConfigString et préférable qu'il soit à l'identique de la configuration Oracle (pour cela une bonne communication avec votre DBA est nécessaire).

Nous avons surtout tâtonné pour trouver le type et la factory car la documentation n'est pas orienté tomcat mais plutôt grand serveurs d'applications commerciaux (je vous laisse deviner lesquels!).

Si vous faites des déploiements à chaud sur Tomcat (déconseillé) il est préférable d'enlever le connectionCacheName pour éviter que Tomcat se plaigne de l'existence d'un cache portant le même nom (apparemment pas de nettoyage à chaud!) : vous serez alors obligé de redémarrer votre serveur Tomcat.

lundi 15 mars 2010

Git : un SCM (Source Code Management) qui vaut le détour

Un peu déçu par SVN, nous nous sommes mis à la recherche d'un nouveau système SCM ou de Gestion de Version . Notre futur SCM sera très probablement GIT. L'article suivant permet de bien débuter sur GIT : http://www.unixgarden.com/index.php/administration-systeme/git-it

Une autre source pour appréhender la gestion de code source avec GIT : http://nvie.com/posts/a-successful-git-branching-model/

- page 1 de 2