Communication avec un broker de message

Bonjour,

J’ai besoin de pusher des messages dans le broker mis en place au niveau global chez Renault.
Pour ce faire, la procédure est d’utiliser la librairie QPID. J’ai cherché dans la doc mais je n’ai pas trouvé ce qu’il me faut. Est-il possible d’importer dans du code serveur Java (type hook) les librairies suivantes:

javax.jms.;
org.apache.qpid.
;

Merci

Nous avons déjà embarqué des libs MQTT dans Simplicité (Eclipse PAHO, https://www.eclipse.org/paho/) les libs Apache QPID sont donc également éligibles à être intégrées (ce n’est pas le cas aujourd’hui)

Ajouter des libs de manière custom n’est pas un problème non plus à partir du moment où vous vous assurez que leurs dépendances ne sont pas incompatibles avec les libs déjà embarquées dans Simplicité (et il y en a un paquet…).

Vous pouvez consulter la liste de celles-ci en consultant le repository Maven exposé par votre instance
sur http(s)://<your base URL>/maven/

Ou sinon via un pom.xml similaire à celui des modules exportés de Simplicité, genre

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>my.group</groupId>
  <version>0.0.1-SNAPSHOT</version>
  <artifactId>test</artifactId>
  <name>Test</name>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <simplicite.url>https://<your base URL></simplicite.url>
    <simplicite.version>4.0.P24</simplicite.version>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>
  <repositories>
    <repository>
      <id>simplicite</id>
      <url>${simplicite.url}/maven</url>
      <releases><enabled>true</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </repository>
  </repositories>
  <dependencies>
    <dependency>
      <groupId>com.simplicite</groupId>
      <artifactId>simplicite-api</artifactId>
      <version>${simplicite.version}</version>
    </dependency>
    <dependency>
      <groupId>com.simplicite</groupId>
      <artifactId>simplicite-api</artifactId>
      <version>${simplicite.version}</version>
      <classifier>javadoc</classifier>
    </dependency>
    <!-- TEST YOUR CUSTOM DEPENDENCIES HERE -->
  </dependencies>
</project>

Si c’est bon (s’il n’y a pas de conflit bloquant) vous avez 2 possibilités:

  1. si on parle d’un ou deux JARs vous pouvez les déclarer au niveau du paramétrage (code partage, type JAR)
  2. si on parle d’un grand nombre de JARs le mieux est de les ajouter “manuellement”, typiquement en Docker il suffit de les copier au bon endroit en construisant une image “enrichie” à partir de nos images standard = il faut les copier soit dans /usr/local/tomcat/lib soit dans /usr/local/tomcat/webapps/ROOT/WEB-INF/lib genre:
FROM simplicite/platform:latest
COPY *.jar /usr/local/tomcat/webapps/ROOT/WEB-INF/lib/

Pour info nous étudions actuellement des mécanismes plus simples pour faire ça par un simple montage de volume.

Bref…

Dans votre cas laissez nous d’abord regarder s’il est pertinent d’intégrer ces libs en standard, si oui vous n’aurez rien à faire (à part vous mettre à jour), si non vous devrez faire ce que je décris ci-dessus.

Parfait, merci de votre réponse. J’attends votre retour.

Merci juste de me confirmer de quelles nouvelles dependances vous avez besoin, si j’en crois votre message initial je pense qu’on parle de celle là https://mvnrepository.com/artifact/org.apache.qpid/qpid-jms-client

Je pose la question car dans le même groupe il y a du monde https://mvnrepository.com/artifact/org.apache.qpid

A noter qu’on intégrera la version la plus récente compatible avec les libs de votre versions de Simplicité (les libs des versions releases ne sont plus upgradées après leur release, sur la branche de dev on les maintient à jour)

Effectivement il s’agit bien de celle là.

Et uniquement celle là ?

Pour qpid oui mais il y a également javax.jms

Au final il est plus simple de vous montrer…
Je voudrais intégrer ce code :

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;

import org.apache.qpid.client.AMQAnyDestination;
import org.apache.qpid.client.AMQConnection;

import org.apache.qpid.jms.ListMessage;


public class ListSender {

    public static void main(String[] args) throws Exception
    {
        Connection connection =
            new AMQConnection("amqp://guest:guest@test/?brokerlist='tcp://localhost:5672'");

        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination queue = new AMQAnyDestination("ADDR:message_queue; {create: always}");
        MessageProducer producer = session.createProducer(queue);

        ListMessage m = ((org.apache.qpid.jms.Session)session).createListMessage();
        m.setIntProperty("Id", 987654321);
        m.setStringProperty("name", "Widget");
        m.setDoubleProperty("price", 0.99);

        List<String> colors = new ArrayList<String>();
        colors.add("red");
        colors.add("green");
        colors.add("white");
        m.add(colors);

        Map<String,Double> dimensions = new HashMap<String,Double>();
        dimensions.put("length",10.2);
        dimensions.put("width",5.1);
        dimensions.put("depth",2.0);
        m.add(dimensions);

        List<List<Integer>> parts = new ArrayList<List<Integer>>();
        parts.add(Arrays.asList(new Integer[] {1,2,5}));
        parts.add(Arrays.asList(new Integer[] {8,2,5}));
        m.add(parts);

        Map<String,Object> specs = new HashMap<String,Object>();
        specs.put("colours", colors);
        specs.put("dimensions", dimensions);
        specs.put("parts", parts);
        m.add(specs);

        producer.send((Message)m);
	System.out.println("Sent: " + m);
        connection.close();
    }

}

OK je regarde si les dependances Maven tirent bien tout ce qu’il faut en partant de qpid-jms-client

1 Like

Est-ce que je peux avoir la liste des dependances du code indiqué ?

Car tout ce qui y est utilisé en org.apache.qpid n’est pas dans la seule dépendance https://mvnrepository.com/artifact/org.apache.qpid/qpid-jms-client

Visiblement les classes utilisées sont plutôt dans celle là: https://mvnrepository.com/artifact/org.apache.qpid/qpid-client

Bonjour David,
Thomas est soumis aux consignes d’activité partielle imposées par Renault.
Il ne pourra donc te répondre que demain matin.
Merci beaucoup pour ton support.
Bruno (qui est puni et reconduit à 100% tous les 15 jours)

Pas de pb je pense que c’est celle là.
C’est dommage ses dépendances étaient plus simples à embarquer que l’autre…

Bon l’ajout de la lib en question a été poussé sur la alpha, j’ai testé avec votre code, ça compile:

A noter que je voulais tester sur une queue RabbitMQ cloud mais je dois rater un truc qque part. Peut être saurez vous m’aider sur ce point car je ne connais ni trop ce produit ni cette lib cliente… Voici les logs que j’obtiens:

2020-04-30 09:13:59,121 INFO  [com.simplicite.objects.Application.AppObject1] SIMPLICITE|http://dev.simplicite.io:10278||INFO|designer|com.simplicite.objects.Application.AppObject1|postSave||Event: Test QPID
2020-04-30 09:13:59,186 DEBUG [org.apache.qpid.client.AMQConnection] Qpid version : qpid - 6.3.4 build: ad4e1bf10ee8b7bd997d0312993bea54d7a5527f
2020-04-30 09:13:59,189 DEBUG [org.apache.qpid.client.security.DynamicSaslRegistrar] public static void registerSaslProviders(): called
2020-04-30 09:13:59,191 DEBUG [org.apache.qpid.client.security.DynamicSaslRegistrar] props = {ANONYMOUS=org.apache.qpid.client.security.anonymous.AnonymousSaslClientFactory, SCRAM-SHA-1=org.apache.qpid.client.security.scram.ScramSHA1SaslClientFactory, SCRAM-SHA-256=org.apache.qpid.client.security.scram.ScramSHA256SaslClientFactory, AMQPLAIN=org.apache.qpid.client.security.amqplain.AmqPlainSaslClientFactory, XOAUTH2=org.apache.qpid.client.security.oauth2.OAuth2SaslClientFactory, CRAM-MD5-HASHED=org.apache.qpid.client.security.crammd5hashed.CRAMMD5HashedSaslClientFactory}
2020-04-30 09:13:59,198 DEBUG [org.apache.qpid.client.security.DynamicSaslRegistrar] Found class org.apache.qpid.client.security.scram.ScramSHA1SaslClientFactory for mechanism SCRAM-SHA-1
2020-04-30 09:13:59,200 DEBUG [org.apache.qpid.client.security.DynamicSaslRegistrar] Found class org.apache.qpid.client.security.anonymous.AnonymousSaslClientFactory for mechanism ANONYMOUS
2020-04-30 09:13:59,201 DEBUG [org.apache.qpid.client.security.DynamicSaslRegistrar] Found class org.apache.qpid.client.security.crammd5hashed.CRAMMD5HashedSaslClientFactory for mechanism CRAM-MD5-HASHED
2020-04-30 09:13:59,201 DEBUG [org.apache.qpid.client.security.DynamicSaslRegistrar] Found class org.apache.qpid.client.security.amqplain.AmqPlainSaslClientFactory for mechanism AMQPLAIN
2020-04-30 09:13:59,202 DEBUG [org.apache.qpid.client.security.DynamicSaslRegistrar] Found class org.apache.qpid.client.security.oauth2.OAuth2SaslClientFactory for mechanism XOAUTH2
2020-04-30 09:13:59,203 DEBUG [org.apache.qpid.client.security.DynamicSaslRegistrar] Found class org.apache.qpid.client.security.scram.ScramSHA256SaslClientFactory for mechanism SCRAM-SHA-256
2020-04-30 09:13:59,203 DEBUG [org.apache.qpid.client.security.JCAProvider] Recording SASL Client factory for AMQPLAIN as org.apache.qpid.client.security.amqplain.AmqPlainSaslClientFactory
2020-04-30 09:13:59,203 DEBUG [org.apache.qpid.client.security.JCAProvider] Recording SASL Client factory for ANONYMOUS as org.apache.qpid.client.security.anonymous.AnonymousSaslClientFactory
2020-04-30 09:13:59,203 DEBUG [org.apache.qpid.client.security.JCAProvider] Recording SASL Client factory for CRAM-MD5-HASHED as org.apache.qpid.client.security.crammd5hashed.CRAMMD5HashedSaslClientFactory
2020-04-30 09:13:59,203 DEBUG [org.apache.qpid.client.security.JCAProvider] Recording SASL Client factory for SCRAM-SHA-1 as org.apache.qpid.client.security.scram.ScramSHA1SaslClientFactory
2020-04-30 09:13:59,203 DEBUG [org.apache.qpid.client.security.JCAProvider] Recording SASL Client factory for SCRAM-SHA-256 as org.apache.qpid.client.security.scram.ScramSHA256SaslClientFactory
2020-04-30 09:13:59,203 DEBUG [org.apache.qpid.client.security.JCAProvider] Recording SASL Client factory for XOAUTH2 as org.apache.qpid.client.security.oauth2.OAuth2SaslClientFactory
2020-04-30 09:13:59,204 INFO  [org.apache.qpid.client.security.DynamicSaslRegistrar] Additional SASL providers successfully registered.
2020-04-30 09:13:59,208 INFO  [org.apache.qpid.client.security.CallbackHandlerRegistry] Callback handlers available for SASL mechanisms: [EXTERNAL, GSSAPI, SCRAM-SHA-256, SCRAM-SHA-1, CRAM-MD5-HASHED, CRAM-MD5, PLAIN, AMQPLAIN, ANONYMOUS, XOAUTH2]
2020-04-30 09:13:59,208 DEBUG [org.apache.qpid.client.AMQConnection] Loaded mechanisms [EXTERNAL, GSSAPI, SCRAM-SHA-256, SCRAM-SHA-1, CRAM-MD5-HASHED, CRAM-MD5, PLAIN, AMQPLAIN, ANONYMOUS, XOAUTH2]
2020-04-30 09:13:59,216 DEBUG [org.apache.qpid.client.AMQConnection] Connection(1):amqp://aprgwgkf:********@chinook.rmq.cloudamqp.com/aprgwgkf'?brokerlist='
2020-04-30 09:13:59,227 DEBUG [org.apache.qpid.client.AMQConnection] AMQP version 0-10
2020-04-30 09:13:59,230 ERROR [com.simplicite.objects.Application.AppObject1] SIMPLICITE|http://dev.simplicite.io:10278||ERROR|designer|com.simplicite.objects.Application.AppObject1|postSave||Event: [1]
java.lang.IllegalArgumentException: BrokerDetails details required for connection.
        at org.apache.qpid.jms.failover.FailoverSingleServer.<init>(FailoverSingleServer.java:54)
        at org.apache.qpid.jms.FailoverPolicy.<init>(FailoverPolicy.java:69)
        at org.apache.qpid.client.AMQConnection.<init>(AMQConnection.java:464)
        at org.apache.qpid.client.AMQConnection.<init>(AMQConnection.java:310)
        at com.simplicite.objects.Application.AppObject1.postSave(AppObject1.java:97)
        at com.simplicite.util.engine.ObjectManager.save(ObjectManager.java:3303)

J’espère juste que ça ne veut pas dire qu’il manque une autre lib.

Quand ce pb sera résolu on backportera l’ajout de cette dépendance sur les beta/latest

En attendant vous pouvez tester sur la alpha sur une instance de test à part de vos instances en effet si vous faites tourner une alpha sur une instance beta ou latest vous ne pourrez pas revenir en beta ou en latest car la base de données aura été altérée pour la alpha (le passage en alpha est sans retour et, actuellement, elle est encore très loin d’être stable).

A première vue cette erreur ne me dit rien… Je vais tester sur une instance de test pour voir si je trouve d’où ça vient.

Bonjour,
Je souhaiterai tester sur l’instance prsdev hébergée chez vous. Est-il possible de la monter en version alpha?

Bonjour David, Thomas,
J’ai la main que cette instance via le SIM (sauf si il y a une procédure d’upgrade à considérer pour préparer l’instance en amont).
@David, je peux m’en charger si tu veux.
@Thomas, peux-tu confirmer que cette instance ne te sert pas à reproduire des situations observées (bugs ou configurations particulières pour demande de support) et que le passage en alpha (sans retour arrière possible) ne posera pas de problème?

Je te le confirme, cette instance est remplacé par une en intra chez Renault. Elle ne sert “plus à rien”.

L’ajout de la lib Apache Qpid a été poussé sur la (pre)release hier soir

Parfait! Est-ce que la fameuse instance prsdev est sur cette version?