jeudi 18 mars 2010

J2EE : faire une servlet / un bouchon de telechargement

Pour ce projet, il faut créer un projet web, et faire un war qui sera exporté et deployer sur le serveur cible.

Voici, un exemple de code de la méthode doGet :


// TODO Auto-generated method stub
File f = new File("D:/temp/zones.pdf");
int length = 0;
ServletOutputStream op = resp.getOutputStream();
ServletContext context = getServletConfig().getServletContext();
String mimetype = context.getMimeType("D:/temp/zones.pdf");

//
// Set the response and go!
//
//
resp.setContentType((mimetype != null) ? mimetype
: "application/octet-stream");
resp.setContentLength((int) f.length());
String original_filename = "zones.pdf";
resp.setHeader("Content-Disposition", "attachment; filename=\""
+ original_filename + "\"");

//
// Stream to the requester.
//
byte[] bbuf = new byte[4096];
DataInputStream in = new DataInputStream(new FileInputStream(f));

while ((in != null) && ((length = in.read(bbuf)) != -1)) {
op.write(bbuf, 0, length);
}

in.close();
op.flush();
op.close();
}


Et voila, c'est fini, et vous obtenez une popup qui vous propose d'enregistrer le pdf.

vendredi 12 mars 2010

J2EE : apache + weblogic

J'ai rencontré un problème bizarre sur une application sur laquelle je travaille ... Cette application web lance un traitement très long plus de 5 minutes .... (c'est pas bien et c'est mal conçu mais ce n'est pas moi qui l'ai fait ... ). Et la j'ai un problème très bizarre ...

Je clique sur ma page et le formulaire "POST" est envoyé, le traitement commence, et au bout de 5 minutes (300s) comme par magie, je recois un nouveau POST et un nouveau traitement se lance et ça par en vrille !!!

Après avoir cherché pas mal de temps, il semblerait que le plugin "apache weblogic" relance une requete POST car il n'a pas eu de réponse au bout du temps par defaut (WLIOTimeoutSecs)(300s)


<VirtualHost 10.14.51.139>
ServerName bocvalobod3.si.fret.sncf.fr
ServerAlias bocvalobod3
<IfModule mod_weblogic.c>
WebLogicHost bocvalobod2.si.fret.sncf.fr
WebLogicPort 11132
WLIOTimeoutSecs 600
idempotent ON
</IfModule>
<Location />
SetHandler weblogic-handler
</Location>
</VirtualHost>



Voici une solution, qui consiste à configurer le plugin et a augmenter la valeur du timeout !!

mardi 2 mars 2010

J2EE : EAR / WAR / JAR / EJB

Comment parteger des jars entre une ou plusieurs webapps, et par exemples des modules ejbs ?

supposons que nous ayons une application de type EAR nommé monApplicationEntreprise.ear.

Ce dernier est composé de 2 webApps (frontOffice.war, backOffice.war), et de 2 modules EJBs nommés frontOffficeServices.jar et backOfficeServices.jar). Chacun de ces jar ont besoin de framework.jar.

1) Une première méthode consisiterais à copier les jars dans chacun des répertoires WEB-INF/lib de chacune des webapps. Cependant, cela conduit à une augmentation importante de la taille des EAR.

Afin de ne pas copier ce jar, nous allons le mettre dans l'EAR au niveau APP-INF/LIB, et la référencer dans le MANIFEST des webapps et des ejbs.

Voici la cible :

monApplicationEntreprise.ear
|
|-- META-INF
| |-- application.xml
|
|-- APP-INF
| |-- lib
| |-- framework.jar
|
|-- frontOffice.war
| |-- META-INF
| |--MANIFEST.MF
|
|-- backOffice.war
| |-- META-INF
| |--MANIFEST.MF
|
|-- backOfficeServices.jar
| |-- META-INF
| |--MANIFEST.MF
| |--ejb-jar.xml
|
|-- frontOfficeServices.jar
|-- META-INF
|--MANIFEST.MF
|--ejb-jar.xml



Voici pour mémoire, le descripteur de deploiement de EAR:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title>Nouveau2</title>
</head>
<body>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC

"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
<display-name>mon application entreprise</display-name>
<description>EAR de mon application entreprise frontOffice</description>
<module>
<ejb>frontOfficeServices.jar</ejb>
</module>
<module>
<ejb>backOfficeServices.jar</ejb>
</module>
<module>
<web>
<web-uri>frontOffice.war</web-uri>
<context-root>/frontOffice</context-root>
</web>
</module>
<module>
<web>
<web-uri>backOffice.war</web-uri>
<context-root>/backOffice</context-root>
</web>
</module>
</application>
</body>
</html>


Ensuite, pour chacune des applications, il nous faut éditer les MANIFEST.MF des applications, et y ajouter la balise classpath (attention, il faut le couper au 60ième caractères, le plus simple étant d'utiliser des outils comme maven pour générer l'ensemble ...)


Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: enwoo
Build-Jdk: 1.4.2_19
buildDate:
svnrevision:
Class-Path: APP-INF/lib/framework.jar APP-INF/ APP-INF/lib/lo
g4j-1.2.11.jar




Voici pour mémoire un exemple de descripteur d'ejbs:

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title>ejb-jar</title>
</head>
<body>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<display-name>frontOfficeServices</display-name>
<enterprise-beans>
<session>
<display-name>FrontOfficeServices</display-name>
<ejb-name>FrontOfficeServices</ejb-name>
<home>com.ejb.FrontOfficeServicesHome</home>
<remote>com.fr.sncf.fret.boctarification.ejb.FrontOfficeServices</remote>
<local-home>com.ejb.FrontOfficeServicesLocalHome</local-home>
<local>com.ejb.FrontOfficeServicesLocal</local>
<ejb-class>com.ejb.FrontOfficeServicesBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>FrontOfficeServices</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
</body>
</html>