12/07/2020Voici une classe Java de lecture et d'enregistrement de la date de dernière exécution d'un traitement, permettant ainsi de gérer un lancement différentiel sur Talend.
La classe comporte 4 méthodes pour 2 types d'usage , selon un enregistrement dans un fichier CSV ou dans une base de données.
Enregistrement dans un fichier CSV
- ecritFichier : écrit la date actuelle avec TRAITEMENT_1 dans le fichier spécifié
ecritFichier
("c:/monfichier.csv",
"TRAITEMENT_1",
new Date()); - litFichier : renvoie la date enregistrée pour TRAITEMENT_1 depuis le fichier spécifié
litFichier ("c:/monfichier.csv", "TRAITEMENT_1");
Enregistrement dans une base de données
Le code a été écrit pour Talend et récupère via globalMap la connexion créée sous le nom tDBConnection_1.
- ecritTable : écrit la date actuelle avec TRAITEMENT_1 dans la table
ecritTable
((java.
sql.
Connection) globalMap.
get("conn_tDBConnection_1"),
"matable",
"matable_date",
"matable_identifiant",
"TRAITEMENT_1",
new Date());- litTable : renvoie la date enregistrée pour TRAITEMENT_1 depuis la table
litTable
((java.
sql.
Connection) globalMap.
get("conn_tDBConnection_1"),
"matable",
"matable_date",
"matable_identifiant",
"TRAITEMENT_1");
Code de la classe
package routines;import java.io.IOException;import java.sql.SQLException;import java.sql.Timestamp;import java.util.Date;import java.util.List;/**
* Lire ou écrire la date de début d'un traitement dans un fichier
* Permet de gérer plusieurs dates grâce à l'utilisation d'identifiants
*
*/public class DateDernTraitement
{ /**
* Lecture de la date de dernier traitement
* -> null si inexistante
* @param sIdentifiant
* @throws IOException
*/ public static Date litFichier
(String sFichier,
String sIdentifiant
) throws IOException { Date dateDernTraitement
=null; if (new java.
io.
File(sFichier
).
exists()) { String sContenu
= new String(java.
nio.
file.
Files.
readAllBytes(java.
nio.
file.
Paths.
get(sFichier
)), java.
nio.
charset.
StandardCharsets.
UTF_8); // -- Recherche de la table dans la liste List
<String
> listeLignes
= java.
util.
Arrays.
asList(sContenu.
split("\n")); int i
=0; boolean bTrouve
=false; while (i
<listeLignes.
size() && !bTrouve
) { List
<String
> elemLigne
= java.
util.
Arrays.
asList(listeLignes.
get(i
).
split(";")); if (elemLigne.
get(0).
equals(sIdentifiant
)) { dateDernTraitement
= TalendDate.
parseDate("yyyy-MM-dd HH:mm:ss", elemLigne.
get(1)); bTrouve
=true; } else i
++; } } return dateDernTraitement
; } /**
* Enregistre la date de début du prochain traitement
* @param sFichier
* @param sIdentifiant
* @param dateDebutProchainTraitement
* @throws IOException
*/ public static void ecritFichier
(String sFichier,
String sIdentifiant,
Date dateDebutProchainTraitement
) throws IOException { String sContenuDesti
=""; if (new java.
io.
File(sFichier
).
exists()) { String sContenu
= new String(java.
nio.
file.
Files.
readAllBytes(java.
nio.
file.
Paths.
get(sFichier
)), java.
nio.
charset.
StandardCharsets.
UTF_8); // -- Concatène tout sauf la ligne du la table en cours List
<String
> listeLignes
= java.
util.
Arrays.
asList(sContenu.
split("\n")); for (int i
=0; i
<listeLignes.
size(); i
++) { if (!listeLignes.
get(i
).
isEmpty()) { List
<String
> elemLigne
= java.
util.
Arrays.
asList(listeLignes.
get(i
).
split(";")); if (!elemLigne.
get(0).
equals(sIdentifiant
)) sContenuDesti
+=listeLignes.
get(i
) + "\n"; } } new java.
io.
File(sFichier
).
delete(); } // Ajoute la ligne en cours sContenuDesti
+=sIdentifiant
+ ";" + TalendDate.
formatDate("yyyy-MM-dd HH:mm:ss", dateDebutProchainTraitement
); java.
nio.
file.
Files.
write(java.
nio.
file.
Paths.
get(sFichier
), sContenuDesti.
getBytes(), java.
nio.
file.
StandardOpenOption.
CREATE); } /**
* Lecture de la date de dernier traitement
* -> null si inexistante
* @param sIdentifiant
* @throws IOException
* @throws SQLException
*/ public static Date litTable
(java.
sql.
Connection connexion,
String sTable,
String sChampDate,
String sChampIdentifiant,
String sValeurIdentifiant
) throws IOException,
SQLException { Date dateDernTraitement
=null; java.
sql.
Statement statement
=connexion.
createStatement(java.
sql.
ResultSet.
TYPE_FORWARD_ONLY, java.
sql.
ResultSet.
CONCUR_READ_ONLY); String sSQL
="SELECT " + sChampDate
+ " FROM " + sTable
+ " WHERE " + sChampIdentifiant
+ "='" + sValeurIdentifiant.
replace("'",
"''") + "'"; java.
sql.
ResultSet resultat
= statement.
executeQuery(sSQL
); // Recherche dans le retour if (resultat.
next()){ dateDernTraitement
=resultat.
getTimestamp(1); } return dateDernTraitement
; } /**
* Enregistre la date de début du prochain traitement
* @param sFichier
* @param sIdentifiant
* @param dateDebutProchainTraitement
* @throws IOException
* @throws SQLException
*/ public static void ecritTable
(java.
sql.
Connection connexion,
String sTable,
String sChampDate,
String sChampIdentifiant,
String sValeurIdentifiant,
Date dateDebutProchainTraitement
) throws IOException,
SQLException { Date dateDernTraitementBase
=litTable
(connexion, sTable, sChampDate, sChampIdentifiant, sValeurIdentifiant
); String sSQL
; if (dateDernTraitementBase
==null) { // Insert sSQL
="INSERT INTO " + sTable
+" (" + sChampDate
+"," + sChampIdentifiant
+ ")" + "VALUES ('" + (new Timestamp(dateDebutProchainTraitement.
getTime())).
toString() + "', '" + sValeurIdentifiant.
replace("'",
"''") + "')"; } else { // Update sSQL
="UPDATE " + sTable
+" SET " + sChampDate
+ "='" + dateDebutProchainTraitement
+ "' WHERE "+ sChampIdentifiant
+ "='" + sValeurIdentifiant.
replace("'",
"''") + "'"; } java.
sql.
Statement statement
=connexion.
createStatement(java.
sql.
ResultSet.
TYPE_FORWARD_ONLY, java.
sql.
ResultSet.
CONCUR_READ_ONLY); statement.
execute (sSQL
); } } Dernière modification le 12/07/2020 - Quillevere.net