Configurer weblogic pour se connecter à une queue TIBCO EMS

Cet article sera un peu moins rock & roll mais pourra peut-être être utile pour certains.
Je souhaite dans le contexte d’une application JEE hébergée sur weblogic consommer les messages d’une queue JMS hebergée sur TIBCO EMS.

Pre-requis

  • Il faut que la queue présente dans TIBCO EMS soit statique et non dynamique
  • Il faut que la queue EMS ait un nom JMDI
  • Il faut que les droits soient positionnés dans EMS

Dépendances

Il faut installer les JARS suivants dans le répertoire lib du domaine weblogic

  • jms.jar
  • jms-2.0.jar
  • tibcrypt.jar
  • tibemsd_sec.jar
  • tibjms.jar
  • tibjmsadmin.jar
  • tibjmsapps.jar
  • tibjmsufo.jar
  • tibrvjms.jar

Configuration weblogic

Il faut réaliser les actions suivantes :

Créer le module JMS et l’assigner sur le serveur managé

Dans ce module JMS, créer une queue distante et renseigner les informations suivantes :

Maintenant renseigner les informations suivantes :

  • Fabrique de contextes initiale JNDI: com.tibco.tibjms.naming.TibjmsInitialContextFactory
  • URL de connexion JNDI : Elle est au format tibjmsnaming://MONSERVEUR:7222
  • Identification : le mot de passe de l’utilisateur
  • Propriété JNDI : le login de l’utilisateur avec la clé java.naming.security.principal
  • Activer le ciblage par défaut

Ensuite, il faut spécifier la destination en indiquant le nom JNDI local et le nom JNDI spécifié sur EMS.

Enfin, il faut spécifier la fabrique de connexion.

sélectionner l’onglet « Fabrique de connexion » et cliquer sur « Nouveau »

Renseigner les informations suivantes :

  • Nom JNDI local : nom JNDI nécessaire au bean MDB pour envoyer les messages
  • Nom JNDI distant : nom JNDI configuré sur EMS
  • Identifiant / Mot de passe : les mêmes que précédemment

Au final vous devriez avoir ce fichier de configuration généré

<?xml version='1.0' encoding='UTF-8'?>
<weblogic-jms xmlns="http://xmlns.oracle.com/weblogic/weblogic-jms" 
			  xmlns:sec="http://xmlns.oracle.com/weblogic/security" 
			  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
			  xmlns:wls="http://xmlns.oracle.com/weblogic/security/wls" 
			  xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-jms http://xmlns.oracle.com/weblogic/weblogic-jms/1.1/weblogic-jms.xsd">
  <foreign-server name="ForeignServer-0">
    <default-targeting-enabled>true</default-targeting-enabled>
    <foreign-destination name="ForeignDestination-0">
      <local-jndi-name>jms.Queue</local-jndi-name>
      <remote-jndi-name>queue.sample</remote-jndi-name>
    </foreign-destination>
    <foreign-connection-factory name="ForeignConnectionFactory-0">
      <local-jndi-name>jms.TibcoConnectionFactory</local-jndi-name>
      <remote-jndi-name>QueueConnectionFactory</remote-jndi-name>
      <username>weblogic</username>
      <password-encrypted>{AES}vD1uLZ</password-encrypted>
    </foreign-connection-factory>
    <initial-context-factory>com.tibco.tibjms.naming.TibjmsInitialContextFactory</initial-context-factory>
    <connection-url>tibjmsnaming://MONSERVEUR:7222</connection-url>
    <jndi-properties-credential-encrypted>{AES}/8v3owbSW</jndi-properties-credential-encrypted>
    <jndi-property>
      <key>java.naming.security.principal</key>
      <value>weblogic</value>
    </jndi-property>
  </foreign-server>
</weblogic-jms>
weblogic

Consommation des messages via un EJB MDB

@MessageDriven(mappedName = "jms.Queue", activationConfig = {
        @ActivationConfigProperty(propertyName = "acknowledgeMode",
                propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType",
                propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "connectionFactoryJndiName", propertyValue = "jms.TibcoConnectionFactory")
})
public class SampleMDBean implements MessageListener {
    @Override
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void onMessage(Message message) {
      //
    }
}
jms

Créer un connecteur KAFKA CONNECT

Après avoir essayé le connecteur de confluent kafka-connect-jdbc, je me suis aperçu qu’il y avait encore quelques bugs qui le rendaient inutilisable dans mon environnement ( notamment avec les champs numériques).

J’ai donc décidé de créer mon propre connecteur. Certes celui-ci sera moins générique mais il correspondra à mon besoin ( ou pas …).

API utilisées

  • JAVA8
  • API KAFKA CONNECT

Configuration maven

Cette configuration me permet de créer un fat jar avec les dépendances nécessaires à la bonne exécution du connecteur.

Voici mon fichier pom.xml

 

Développement

Comme le dit le guide de développement, il faut créer a minima une classe héritant de la classe SourceConnector et une classe héritant de SourceTask.

MySourceConnector

Cette classe permet la récupération de la configuration du connecteur.

MySourceTask

Cette classe gère l’exécution de l’extraction et chargement dans KAFKA. Elle permet dans la méthode start() de démarrer le connecteur et de lancer les ressources (connexions JDBC).

Comme le connecteur standard, je m’appuie sur un champ de type Timestamp. celui -ci me permet de créer un offset et de faire un parcours incrémental de mes résultats .

Configuration nécessaire à l’exécution du plugin

Il faudra créer également un fichier properties contenant les informations suivantes :

Exécution

De la même manière que pour le connecteur standard…

Conclusion

Voila le squelette de mon connecteur crée. Pour l’instant les données sont sérialisées de manière un peu brutale. La prochaine étape sera de les mettre au format JSON. La suite dans un prochain numéro…

Mettre en place KAFKA CONNECT et KAFKA pour faire du change data capture (CDC)

Je suis en train de monter un moteur d’analyse permettant d’analyser les logs d’un ESB.

L’outil standard stockes les évènements dans une base de données.

Afin d’être le moins intrusif possible dans le code des médiations, j’ai choisi de mettre en place un mécanisme de change data capture (CDC) avec KAFKA CONNECT et KAFKA. Pour ce faire j’ai déployé la solution confluent. Celle-ci permet entre autres d’avoir des connecteurs JDBC permettant la connexion aux bases de données relationnelles.

KAFKA est un système de messagerie distribué crée initialement par LinkedIn. Kafka connect fournit une interface en entrée et en sortie de ce dernier.

Si vous voulez plus d’informations, vous pouvez aller du coté de la présentation du devox 2016

Installation

J’ai utilisé la procédure décrite ici

Démarrage des différents démons

Configuration du connecteur JDBC pour KAFKA CONNECT

Il faut tout d’abord copier le driver jdbc dans le répertoire share/java/kafka-connect-jdbc/

Ensuite, il faut créer un fichier de configuration (ex. esb-logs.properties )

Les contraintes de KAFKA CONNECT sont les suivantes

  • Si on veut faire des extractions incrémentales ( ce qui est mon cas) , il faut soit un élément de type TIMESTAMP qui ne puisse pas être NULL, soit une PK auto-incrémentée.
  • Les requêtes doivent être relativement assez simples. Personnellement, je préfère utiliser des vues qui me retournent l’exécution des requêtes SQL.

Exécution

Lancer la commande

Pour vérifier que tout est bien dans le topic KAFKA

Conclusion

Pour l’instant, j’ai réussi à extraire des données de ma base de données vers un broker KAFKA. La suite me permettra de les traiter en mode streaming dans SPARK.

Utiliser SBT derrière un proxy d’entreprise

J’essaye depuis quelques temps de faire fonctionner SBT derrière un proxy d’entreprise ( avec authentification) . Vu que je ne veux pas polluer le serveur NEXUS existant, j’ai essayé de tout faire un local …. et là c’est le drame.

g1366824328707416474

Jusqu’à présent, j’utilisais MAVEN et le plugin SCALA pour répondre aux besoins du BUILD. J’ai néanmoins trouvé une autre solution, tout aussi sale…. Installer un serveur NEXUS sur le poste de travail et s’en servir comme proxy « intelligent ».

J’ai fait la configuration suivante :

Dessin1

Je ne vais pas décrire ici l’installation de nexus tellement c’est simple.

Dans la configuration de nexus, le proxy se configure assez simplement dans la partie server

J’ai ajouté les virtual repositories suivants :

  • ivy-releases-1: https://dl.bintray.com/sbt/sbt-plugin-releases/
  • ivy-releases-2: https://dl.bintray.com/typesafe/ivy-releases/
  • mvn-typesafe-release-1: http://repo.typesafe.com/typesafe/maven-releases/
  • mvn-typesafe-release-2: http://repo.typesafe.com/typesafe/releases/

et crée deux groupes l’un pour les repo ivy (ivy-releases) et l’autre pour maven (mvn-releases)

Enfin, comme l’indique la documentation, j’ai configuré le fichier ~.sbt/repositories de la manière suivante :

Enfin, lorsque vous exécutez sbt, celui-ci utilisera automatiquement votre proxy NEXUS qui lui est capable de discuter avec un proxy d’entreprise.

En espérant que ça serve à d’autres…

Normaliser une adresse avec ElasticSearch et la base adresse nationale

Il y a fort fort longtemps, j’intégrais la base adresse nationale dans elasticsearch via logstash. Je ne suis pas allé plus loin faute de temps et peut-être d’envie.

Que peut-on faire avec ces quelques gigas de données me direz vous?

  • Faire des recherches pour avoir les coordonnées géographiques d’une adresse donnée
  • Faire une recherche pour avoir l’adresse normalisée
  • Faire un rapprochement avec d’autres données (avec Spark par exemple)
  • Sans doute plein d’autres use cases

Je vais m’attarder sur le deuxième point. A quoi ça sert ? et bien à avoir une adresse « propre » et utilisable par un système d’information (ex. ce que font les impôts, ou amazon). Il existe quelques solutions propriétaires qui réalisent ceci et sont assez chers. Je me suis donc mis dans la tête de le faire via elasticsearch.

Rappels des épisodes précédents

Voici le schéma de l’architecture

Présentation1

Pré-requis

Configuration Logstash

Voici ma configuration Logstash

J’ai configuré LOGSTASH pour réaliser les actions suivantes :

  • extraction des données d’un fichier
  • suppression de la ligne d’en-tête
  • gestion de la localisation avec un champ de type ‘geo_point’.

C’est assez simple (pour l’instant)

Mapping ELASTICSEARCH

Analyzers

J’ai configuré les analyzers de la manière suivante:

J’ analyse tous les mots (whitespace tokenizer) en minuscule en appliquant un filtre (ngram) permet de rechercher par caractère (ex. imp au lieu de impasse).

La c’est super couteux en espace disque et impose un plus gros traitement lors de l’insertion mais permet d’ alléger le temps de traitement des requêtes ( le gros du travail est fait lors du chargement).

Mapping

La je n’ai pas fait grand chose de particulier si ce n’est le typage des différents champs (ex. la localisation )

Création de l’index

Dans sense ou via cUrl, lancer la commande suivante :

Pour le mapping complet, voir sur mon compte github

Chargement

voir mon article précédent

Interrogation

Maintenant je peux interroger mon index

Imaginons que je fasse saisir le code postal, la ville et l’adresse et que j’interroge elasticsearch pour obtenir une adresse normalisée

Conclusion

Ce n’est qu’un début. Ce n’est sans doute pas encore très performant, si vous avez des remarques, n’hésitez pas. En tout cas, les briques et outils décrits ci-dessus permettent de normaliser des adresses a minima avec des logiciels libres, ce qui n’est pas rien.

Les sources sont disponibles sur GITHUB. Je ne pense pas que je vais en faire un projet à proprement parler mais plutôt d’une boîte à outils pour manipuler ce genre de données. J’y ajouterai sans doute quelques recherches géospatiales et peut être l’ intégration de graph.

Quoi de neuf du coté du front-end

Depuis le début de l’année je suis en train de faire une spécialisation Coursera : Full Stack Developer.

Pourquoi me direz-vous ? Tout d’abord, j’ai principalement travaillé sur du back-office ou de l’outillage. Ça m’a servi de rattrapage sur ces technologies :

  • HTML/CSS ( ne rigolez pas j’ai appris des choses…)
  • Bootstrap
  • Angular
  • Applications mobiles hybrides
  • NodeJS

Sachant que j’ai principalement travaillé sur JAVA, ça m’a fait un peu bizarre

Qu’est-ce que j’en ai retenu:

Javascript et les langages interprétés, ce n’est pas fait pour moi. Un compilateur c’est quand même bien pour découvrir des erreurs de syntaxes (je suis trop vieux pour ces co%%%£$$) …. Les puristes du javascript me diront qu’il y a les tests unitaires. Pour moi ça ne remplace pas un compilateur. Pas étonnant que des initiatives comme typescript ou babeljs arrivent massivement sur le marché.

Je comprends pourquoi AngularJS a inondé le marché ces dernières années. C’est assez bien foutu.

Le combo NodeJS/express/mongoose permet de réaliser des APIS et des requêtes facilement .

Un exemple de route pour une requête GET

Un exemple de requête qui m’a bluffé

Pour conclure, je ne  pense pas que je ferai des sites web de sitôt, mais ça m’a donné une bonne vision d’ensemble des technologies.

Devoxx 2016

Ben voila, j’écris ce billet entre deux confs lors de l’édition 2016 du devoxx.index
QUOI, vous ne connaissez pas devoxx ? c’est à mon avis LA conférence française du développement JAVA, SCALA,BIG DATA.

C’est très très technique et c’est tant mieux. Commerciaux et chefs de projets, vous pouvez passer votre chemin 🙂

J’ai pu notamment faire des hands on sur apache kafka, vert.x et sur la création d’architectures.

Petite nouveauté, les conférences seront disponibles sur youtube ( je ne connais pas encore la chaîne ).

Si vous ne connaissez pas, voici quelques conférences de l’année dernière

Quid des données personnelles ?

2998710223_d29e8eceb6_z

Ces derniers mois j’ai pu réaliser deux salons assez intéressants : le BIG DATA PARIS et l’IOT WORLD.
Dans la première conférence, j’ai pu voir pas mal de conférences intéressantes sur les tendances actuelles :

ainsi que les use cases :

  • Maintenance prédictive : Grâce au machine learning on arrive à prévoir les pannes et intervenir avant que celle-ci se déclenche. La prochaine étape sera sans doute Minority Report….
  • Stockage massif des données non structurées ( IOT, logs,…) pour utilisation (marketing) et revente.

Si on exclut les éditeurs qui fournissent des solutions « clés en main ». Toutes les briques de base sont open-source. Beau pied de nez aux éditeurs qui fustigeaient les logiciels libres il y a une dizaine d’années arguant que ce modèle n’est pas viable :).

Dans la deuxième conférence, j’ai vu voir la plateforme AWS IOT. Ça claque, Amazon vend de manière très agressive une solution tout en un, de l’objet avec des kits estampillés « AWS IOT » jusqu’à la plateforme BIGDATA permettant de traiter et d’analyser ces données.

Enfin j’ai pu avoir une perspective sur le futur du marché automobile. L’UE souhaite que les véhicules deviennent connectés à partir de 2019. L’arrivée des GAFA accélère fortement le marché. Les constructeurs automobiles souhaitent changer le business model (achat –> location) et se transformer en fournisseur de données grâce à de nombreux capteurs, une puce 3G obligatoire sur chaque véhicule et près de 150To / véhicule / an. De quoi faire le business des marchands de datacenter et des équipes marketing pendant quelques années.

Outre les points positifs purement techniques que j’ai vu lors de ces conférences, j’ai pu malheureusement noter les points suivants :

L’utilisation massive du Cloud ne garantit en rien la sécurité des données. En effet, près de 30% des données sont revendus à des tiers même si on a coché la bonne case lors de la souscription du contrat.

Un exemple Amazon AWS est soumis au Patriot / Liberty Act . Je vous laisse deviner ce qui peut arriver si Airbus lâche sur le cloud Amazon les plans de ses futurs avions sur le cloud Amazon.

Aussi, les dispositifs législatifs actuels sont sous dimensionnés pour lutter contre la réutilisation frauduleuse des données. La CNIL évolue ( les amendes vont passer de 170 K€ à 4% du CA), mais les avocats qui étaient aux conférences indiquaient que passer des contrats avec des sociétés étrangères à l’UE était un risque

Enfin, on va réussir grâce au BIG DATA à corréler d’innombrables données qui permettront dans le meilleur des cas de faire pas mal d’optimisations (ex. la ville de new york), mais aussi de connaître le comportement des gens et même de le prévoir.

big_brother_is_watching_you_by_nighted

Tout ça pour dire qu’on va être de plus en plus fliqué. Je m’en doutais, mais c’est dorénavant pour moi une certitude. Le « BIG BROTHER » nous attend désormais au coin de la rue. Que ça soit par les états ou pire par les sociétés. Pour illustrer mon propos, et je finirai là, je pourrais prendre pour exemple les voitures connectées. Les intervenants représentant les constructeurs indiquaient que les données étaient soit-disant anonymisées mais que les forces de l’ordre pouvaient y avoir accès et qu’il pouvaient réaliser des conseils personnalisés…. Bref, ce n’est pas anonymisé pour tout le monde 🙁

Intégrer dans docker une application ANGULAR

dockerangularjs

Dans le cadre d’un POC j’ai eu à « dockeriser » une application ANGULARJS. Cette dernière utilise les briques logicielles suivantes :

J’ai donc utilisé docker-compose pour orchestrer le tout. Voici la configuration

Définition du front

Dans le répertoire front, j’ai ajouté les sources (JAVASCRIPT, HTML, CSS,…). Ca donne

Définition du back

Pour le back, vu que c’est du mock, je ne me suis pas trop embêté. J’ai donc utilisé json-server et ajouté dans le répertoire config le fichier json correspondant aux bouchons.

Exécution

Construction du projet

A la racine

Exécution

Conclusion

Et voila vous avez un site basé sur angular avec utilisation d’une API REST utilisable . Il manque encore certaines briques indispensables telles que ha_proxy par ex, mais ça me suffit pour une démo.