Talend - Les routines

Talend - Les routines

Talend Open Studio permet d'ajouter des routines de code Java qui pourront être utilisées ensuite dans des jobs.
Une routine est un ensemble de fonctions qui seront utilisables dans des row generators ou d'autres objets de la palette.

Voici tout d'abord un exemple d'utilisation de routine pour le traitement de date, puis la description de la routine.

Utilisation de la routine

Pour illustrer l'utilisation de la routine, nous avons un job qui récupère le fixing de 4PM de Londres des cours des principales paires de devises. Pour requeter ces données, nous devons passer en argument la date souhaitée et l'heure en UTC.
Comme nous ne sommes pas dans la même timezone que Londres, nous ne pouvons pas nous baser sur un offset avec "Locale" qui est dans les fonctions par defaut de Talend et il ne faut pas oublier qu'il y a le changement d'heure été/hiver tous les 6 mois.

Voici notre job exemple:
talend02

Nous utilisons un tRestClient afin de récuperer les données:
talend03
et dans le paramètre dateTime, nous avons l'utilisation de notre routine:

DateConversions.dateLondonToUTCString(context.fixingDateTime)

et le context est fixé ainsi pour les tests (mais peut être un paramètre par la suite):
talend04-1

Les données récupérées sont traitées par le composant tExtractJSon avec le paramétrage suivant:
talend05

A ces données, nous ajoutons quelques informations complémentaires comme la date à laquelle l'import a été effecuté ainsi que la date et heure de fixing requeté. Nous avons donc un composant tMap alimenté par un tContextDump et un tRowGenerator (qui a juste un appel à getCurrentDate()) et qui a le setup suivant:
talend06

Le tout est ensuite envoyé à une base de donnée PostgreSQL.
talend07

Création de la routine

Pour ajouter une routine, il suffit de faire un click droit sur "Routines" dans l'écran de navigation du Repository.
talend01

Le code utilisé pour cette routine est ci-dessous. Une fonction de routine est une fonction public et static avec une série de commentaires.
Pour des raisons de compatibilité, nous utilisons toujours les objets Date et Calendar de java.util.
Il y a plusieurs fonctions avec différentes signatures pour faciliter l'usage par la suite.

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class DateConversions {
    
    /**
     * Convert a date time from London timeZone to UTC even if you are not in the London timeZone
     *
     * @param dateToConvert the date time value in London TimeZone
     * @return converted date time in UTC
     *
     * {talendTypes} Date
     *
     * {Category} User Defined
     *
     * {param} new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-08-08 16:00:00") date : the date time value
     *
     * {example} dateLondonToUTC(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-08-08 16:00:00")) #
     */
    public static Date dateLondonToUTC(Date dateToConvert) {
        Calendar londonCalendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/London"));
        return new Date(dateToConvert.getTime() - londonCalendar.getTimeZone().getOffset(dateToConvert.getTime()));
    }
    
    /**
     * Convert a String representing a date time from London timeZone to UTC even if you are not in the London timeZone
     *
     * @param dateToConvert the date time value in London TimeZone
     * @return converted date time in UTC
     *
     * {talendTypes} Date
     *
     * {Category} User Defined
     *
     * {param} "yyyy-MM-dd HH:mm:ss" String format of the date time value
     *
     * {example} stringLondonToUTC("2017-08-08 16:00:00") #
     * @throws ParseException 
     */
    public static Date stringLondonToUTC(String dateToConvert) throws ParseException {
        return dateLondonToUTC(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateToConvert));
    }
    
    /**
     * Convert a date time from London timeZone to UTC String date even if you are not in the London timeZone
     *
     * @param dateToConvert the date time value in London TimeZone
     * @return converted String representing the date time in UTC
     *
     * {talendTypes} Date
     *
     * {Category} User Defined
     *
     * {param} "yyyy-MM-dd HH:mm:ss" String format of the date time value
     *
     * {example} stringLondonToUTC("2017-08-08 16:00:00") #
     * @throws ParseException 
     */
    public static String dateLondonToUTCString(Date dateToConvert) throws ParseException {
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        return df.format(dateLondonToUTC(dateToConvert));
    }
}