IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

OpenJMS créer un topic depuis du code Java


Sujet :

Java

  1. #1
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut OpenJMS créer un topic depuis du code Java
    Bonsoir,

    dans le cadre d'un projet type "réseau social", je veux intégrer une feature consistant à notifier les utilisateurs de certains évènements concernant leurs relations dans le réseau. Je considère que chaque utilisateur est un "topic" auquel d'autres utilisateurs peuvent s'abonner.

    Pour cela je compte utiliser JMS et j'essaie de tester quelques actions simples comme souscrire à un topic ou créer un topic.

    J'utilise OpenJMS qui fonctionne correctement avec les exemples fournis par OpenJMS (en ligne de commande).

    J'ai bricolé une classe qui est censée faire le job (désolé pour les println qui alourdissent la lecture, mais je souhaitais vérifier que tout allait bien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    /**
     * 
     */
    package com.citizenweb.utilz;
    
    import java.util.Hashtable;
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.MessageConsumer;
    import javax.jms.MessageProducer;
    import javax.jms.Session;
    import javax.jms.Topic;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    
    /**
     * @author Fred
     *
     */
    public class NotificationManager {
    
    	Context context = null;
    	ConnectionFactory jmsFactory = null;
    	Connection connection = null;
    	String factoryName = "ConnectionFactory";
    	String destName = null;
    	Destination dest = null;
    	Session session = null;
    	MessageProducer sender = null;
    	MessageConsumer receiver = null;
    
    	public NotificationManager(){
    		
    	}
    	
    	private void connect(){
    		try{
    			//create the JNDI initial context
    			System.out.println("CONNECT");
    			Hashtable<String,String> properties = new Hashtable<String,String>();
    			properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.exolab.jms.jndi.InitialContextFactory");
    			properties.put(Context.PROVIDER_URL, "tcp://localhost:3035/");
    			properties.put(Context.SECURITY_CREDENTIALS, "openjms");
    			properties.put(Context.SECURITY_PRINCIPAL, "admin");
    			
    			context = new InitialContext(properties);
    			System.out.println(context.toString());
    			//lookup the ConnectionFactory
    			jmsFactory=(ConnectionFactory)context.lookup(factoryName);
    			System.out.println(jmsFactory.toString());
    			
    			//create connection
    			connection = jmsFactory.createConnection();
    			System.out.println(connection.toString());
    			//create the session
    			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    			System.out.println(session.toString());
    
    			
    		}catch(JMSException e){
    			System.out.println("<< ERREUR in " + this.getClass().getSimpleName()+" | Méthode : connect()");
    			e.printStackTrace();
    		}catch(NamingException e){
    			System.out.println("<< ERREUR in " + this.getClass().getSimpleName()+" | Méthode : connect()");
    			e.printStackTrace();
    		}
    	}
    
    	public Boolean createTopicUser(String topicUser){
    		System.out.println("CREATE TOPIC");
    		boolean done = false;
    		try {
    			connect();
    			connection.start();
    			System.out.println("TOPIC USER = " + topicUser);
    			session.createTopic(topicUser);
    			done = true;
    			System.out.println("DONE = " + done);
    			System.out.println("CONNECT META DATA : " + connection.getMetaData());
    		} catch (JMSException e) {
    			System.out.println("<< ERREUR in " + this.getClass().getSimpleName()+" | Méthode : createTopicUser()");
    			e.printStackTrace();
    		} finally {
    			if(context != null){
    				try {
    					context.close();
    				} catch(NamingException e){
    					System.out.println("<< ERREUR in " + this.getClass().getSimpleName()+" | Méthode : createTopicUser()");
    					e.printStackTrace();
    				}
    			}
    			if(connection != null){
    				try {
    					connection.close();
    				} catch (JMSException e) {
    					System.out.println("<< ERREUR in " + this.getClass().getSimpleName()+" | Méthode : createTopicUser()");
    					e.printStackTrace();
    				}
    			}
    		}
    		return done;
    	}
    	
    	public Boolean subscribeTopic(String topic, String idUser){
    		boolean done = false;
    		try {
    			connect();
    			connection.start();
    			dest = (Destination) context.lookup(topic);
    			session.createDurableSubscriber((Topic) dest, idUser);
    			done = true;
    		} catch (NamingException e) {
    			System.out.println("<< ERREUR in " + this.getClass().getSimpleName()+" | Méthode : createTopicUser()");
    			e.printStackTrace();
    		} catch (JMSException e) {
    			System.out.println("<< ERREUR in " + this.getClass().getSimpleName()+" | Méthode : createTopicUser()");
    			e.printStackTrace();
    		} finally {
    			if(context != null){
    				try {
    					context.close();
    				} catch(NamingException e){
    					System.out.println("<< ERREUR in " + this.getClass().getSimpleName()+" | Méthode : createTopicUser()");
    					e.printStackTrace();
    				}
    			}
    			if(connection != null){
    				try {
    					connection.close();
    				} catch (JMSException e) {
    					System.out.println("<< ERREUR in " + this.getClass().getSimpleName()+" | Méthode : createTopicUser()");
    					e.printStackTrace();
    				}
    			}
    		}
    		return done;
    	}
    	
    }
    Le résultat que j'obtiens est quelque peu décevant : j'ai bien des objets qui sont créés (sessionfactory, session, connection, etc. -> j'imprime leur hashcode), mais jamais le Topic que je passe en argument à la méthode "createTopicUser()" n'est créé.

    Si je vais vérifier dans la "console admin" d'OpenJMS le topic n'est pas créé et je n'en trouve bien sûr aucune trace dans la base de données d'OpenJMS (sous MySQL dans mon cas).

    Voilà ce que j'imprime dans la console à l'exécution (pas de message d'erreur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TOPIC
    CONNECT
    javax.naming.InitialContext@5b464ce8
    org.exolab.jms.client.JmsConnectionFactory@246ae04d
    org.exolab.jms.client.JmsConnection@68c4039c
    org.exolab.jms.client.JmsSession@29ca901e
    TOPIC USER = tata
    DONE = true
    CONNECT META DATA : org.exolab.jms.client.JmsConnectionMetaData@5025a98f
    Voici le 'main' que j'exécute directement depuis Eclipse :

    package com.citizenweb.utilz;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    /**
     * @author Fred
     *
     */
    public class Run {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		NotificationManager nm = new NotificationManager();
    		nm.createTopicUser("tata");
    	}
     
    }
    Avez-vous une idée de pourquoi le Topic n'est pas créé ?

    Question subsidiaire : j'ai fait un 'main()' parce qu'il m'était impossible de faire tourner cette classe depuis jUnit -> je ne comprends pas pourquoi jUnit ne peut pas utiliser cette classe ??

    Merci d'avance pour votre aide.

    Fred

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Salut,

    Si le topic n'a pas pu être créé, cela doit te lancer une JMSException (voir javadoc).
    Utilise un try/catch pour remonter l'erreur.

    PS: Utilises-tu les transactions JMS ?

    Cordialement,
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut EDIT
    Bonjour Gugelhupf,

    je pensais avoir mis tous les try/catch nécessaires pour intercepter le moindre problème, mais rien ne remonte (indique moi éventuellement où je devrais rajouter un contrôle le cas échéant).

    Je viens de basculer sur ActiveMQ qui, selon la littérature, semble plus adapté pour créer des Topics via le code, mais j'ai exactement le même problème.

    Quant au transactionnel, je ne sais pas te répondre. Je n'ai rien paramétré / configuré qui évoquait ce sujet et je n'ai rien dans mon code en ce sens.

    Sur ce dernier point, je viens de regarder à nouveau la création de la session, et le paramètre "transaction" était à FALSE. Je fais un test avec TRUE.

  4. #4
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut
    Je viens de refaire un test basé sur ActiveMQ dont je n'ai pas modifié la conf après installation (je suis sur les paramètres par défaut).

    Avec ce code simplifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    /**
     * 
     */
    package com.citizenweb.utilz;
     
    import java.util.Hashtable;
     
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.JMSException;
    import javax.jms.MessageConsumer;
    import javax.jms.MessageProducer;
    import javax.jms.Session;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
     
    import org.apache.activemq.Message;
    import org.apache.activemq.broker.region.Destination;
     
    /**
     * @author Fred
     *
     */
    public class Run2 {
     
    	/**
             * @param args
             * @throws NamingException 
             * @throws JMSException 
             */
    	public static void main(String[] args) throws NamingException, JMSException {
     
    		Context context = null;
    		ConnectionFactory factory = null;
    		Session session = null;
    		Connection connection = null;
    		Destination dest = null;
    		MessageProducer sender = null;
    		MessageConsumer receiver = null;
    		Message message = null;
    		String factoryName = "ConnectionFactory";
    		String destName = null;
     
    		Hashtable<String,String> properties = new Hashtable<String,String>();
    		properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
    		properties.put(Context.PROVIDER_URL, "vm://localhost:61616");
    		properties.put(Context.SECURITY_PRINCIPAL, "admin");
    		properties.put(Context.SECURITY_CREDENTIALS, "admin");
    		context = new InitialContext(properties);
     
    		factory = (ConnectionFactory) context.lookup(factoryName);
    		connection = (Connection) factory.createConnection();
    		session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
     
    		connection.start();
     
    		session.createTopic("TATA");
    		session.commit();
     
    		session.close();
    		connection.close();
    		context.close();
     
    	}
     
    }
    Suite à la précédente question de Gugelhupg, j'ai positionné le paramètre "transaction" à "true" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
    Même soucis.

    Voici ce que j'imprime dans la console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     INFO | Using Persistence Adapter: KahaDBPersistenceAdapter[C:\Users\Fred\git\NewRezoSoss\RezoSoss\activemq-data\localhost\KahaDB]
     INFO | JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
     INFO | KahaDB is version 6
     INFO | Recovering from the journal @1:2884
     INFO | Recovery replayed 1 operations from the journal in 0.012 seconds.
     INFO | PListStore:[C:\Users\Fred\git\NewRezoSoss\RezoSoss\activemq-data\localhost\tmp_storage] started
     INFO | Apache ActiveMQ 5.13.3 (localhost, ID:NASTYBOY-54111-1468239658100-0:1) is starting
     INFO | Apache ActiveMQ 5.13.3 (localhost, ID:NASTYBOY-54111-1468239658100-0:1) started
     INFO | For help or more information please see: http://activemq.apache.org
     WARN | Store limit is 102400 mb (current store usage is 0 mb). The data directory: C:\Users\Fred\git\NewRezoSoss\RezoSoss\activemq-data\localhost\KahaDB only has 16496 mb of usable space. - resetting to maximum available disk space: 16496 mb
     WARN | Temporary Store limit is 51200 mb (current store usage is 0 mb). The data directory: C:\Users\Fred\git\NewRezoSoss\RezoSoss\activemq-data\localhost only has 16496 mb of usable space. - resetting to maximum available disk space: 16496 mb
     INFO | Connector vm://localhost started
     INFO | Connector vm://localhost stopped
     INFO | Apache ActiveMQ 5.13.3 (localhost, ID:NASTYBOY-54111-1468239658100-0:1) is shutting down
     INFO | PListStore:[C:\Users\Fred\git\NewRezoSoss\RezoSoss\activemq-data\localhost\tmp_storage] stopped
     INFO | Stopping async queue tasks
     INFO | Stopping async topic tasks
     INFO | Stopped KahaDB
     INFO | Apache ActiveMQ 5.13.3 (localhost, ID:NASTYBOY-54111-1468239658100-0:1) uptime 0.730 seconds
     INFO | Apache ActiveMQ 5.13.3 (localhost, ID:NASTYBOY-54111-1468239658100-0:1) is shutdown

    Pas d'erreur catchée, il semble faire son travail, mais rien n'est créé dans la console ActiveMQ.

  5. #5
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Essaye de placer le bloc try/catch autour de l'instruction createTopic().
    Ca fait un bail que je n'ai pas touché à JMS, et c'était en mode non-transactionnel mais je ne pense pas que cela ait une influence (+ je me rappelle d'avoir créé mes Queues/Topics via le panel d'administration à l'époque).
    Peut-être que le topic n'est créé physiquement que lorsque tu envoies ton premier message ? As-tu essayé d'envoyer un premier message ?
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Lovegiver Voir le message
    Bonsoir,

    dans le cadre d'un projet type "réseau social", je veux intégrer une feature consistant à notifier les utilisateurs de certains évènements concernant leurs relations dans le réseau. Je considère que chaque utilisateur est un "topic" auquel d'autres utilisateurs peuvent s'abonner.
    C'est bizarre comme manière de faire, les message étant éphémère, quand l'utilisateur arrivera sur la page pour voir le message ou la rechergera, il n'y sera plus :/

    Mais bon.

    Concernant ton code, je crois que tu confond. Session.createTopic, ça ne crée pas une topic sur le serveur, ça crée un objet Topic dans ton client que tu pourra ensuite utiliser pour poster / souscrire à la topic concernée. C'est en gros un wrapper sur la String donnant le nom de la Topic.
    http://docs.oracle.com/javaee/7/api/...a.lang.String-
    It does not create the physical topic in the JMS provider. JMS does not provide a method to create the physical topic, since this would be specific to a given JMS provider. Creating a physical topic is provider-specific and is typically an administrative task performed by an administrator,

    Une fois que tu as ton objet Topic, tu peux créer un MessageProducer et utiliser ce dernier pour envoyer des messages. C'est uniquement quand tu enverra le message que tu saura si ton serveur accepte de créer ta Topic à la volée.

    Citation Envoyé par Lovegiver Voir le message
    Question subsidiaire : j'ai fait un 'main()' parce qu'il m'était impossible de faire tourner cette classe depuis jUnit -> je ne comprends pas pourquoi jUnit ne peut pas utiliser cette classe ??

    Fred
    Message d'erreur si tu veux qu'on t'aide là dessus.

  7. #7
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut
    Bonjour Tchize,

    merci d'avoir jeté un oeil sur ma question.

    Effectivement, concernant la création dynamique (par la programmation) de Topic avec OpenJMS, j'ai laché l'affaire parce que j'ai vu ça sur le site d'ActiveMQ :

    In ActiveMQ you do not have to create destinations up front before you can use them. The ActiveMQ broker auto-creates the physical resources associated with a destination on demand (i.e. when messages are sent to a new destination on a broker).

    This means that a client can create a new Queue or Topic dynamically either by

    calling createQueue() or createTopic() on a JMS Session
    creating an instance of ActiveMQTopic or ActiveMQQueue and possibly registering them in JNDI

    and the broker will automatically create the physical destinations for you. This avoids spending large amounts of time creating every individual destination you wish to use and possibly then exposing it in some JNDI provider.
    Gugelhupf m'avait mis sur la voie quand il disait :

    Peut-être que le topic n'est créé physiquement que lorsque tu envoies ton premier message ? As-tu essayé d'envoyer un premier message ?
    C'est ce que j'essaie de faire depuis 2 jours : appel à la méthode "createTopic()" et envoi d'un premier message mais rien ne se passe.
    -> est-ce que je ne respecte pas un ordre précis ?
    -> ai-je besoin d'installer TomEE ou Geronimo qui embarquent les bons paramètres "out-of-the-box" ? Quoique sur ce point j'ai un doute car je pense qu'ActiveMQ s'exécute actuellement sur son propre serveur (je peux accéder à sa console d'admin et réaliser des opérations dessus).

    Concernant jUnit, je n'ai justement pas de message d'erreur si ce n'est un NullPointerException qui m'indique que ni le Context ni la ConnectionFactory ni rien n'a été créé, mais je regarderai de plus près quand mes gamins auront laché mon PC.



    Je reviens sur ta remarque première concernant le choix de JMS :

    C'est bizarre comme manière de faire, les message étant éphémère, quand l'utilisateur arrivera sur la page pour voir le message ou la rechergera, il n'y sera plus :/
    Pourrais-tu m'expliciter tes doutes, car c'est important pour moi de ne pas partir sur une mauvaise solution.

    Ce qui m'intéressait, c'était de prévenir un utilisateur qu'il avait reçu une réponse à un message ou de prévenir l'ensemble de ses contacts qu'il avait écrit un nouveau message par exemple. Les notifications à la sauce JMS me semblaient adaptées à cet usage. Cette solution étant déjà disponible cela évitait d'avoir à prévoir dans mon modèle de données un système de notifications et d'abonnement.

    Le use case est le suivant : tout ce qui concerne un utilisateur fait l'objet d'un nouveau message dans un topic propre à cet utilisateur. Chaque personne abonné à ce topic (donc à cet utilisateur) reçoit autant de notifs qu'il y a d'événements. Ces notifs seront stockées dans un tableau que l'abonné pourra parcourir au moyen par exemple d'un menu déroulant.

    Penses-tu qu'il y ait une meilleure façon de procéder ?

    Merci de me faire profiter de ton expertise et pour tes conseils.

    Fred

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Lovegiver Voir le message


    C'est ce que j'essaie de faire depuis 2 jours : appel à la méthode "createTopic()" et envoi d'un premier message mais rien ne se passe.
    Comme toujours, code associé? Je ne vosi pas de code dans ce thread où tu envoie des messages. Qu'entends tu par "rien ne se passe"? Le message ne part part? Le destinataire ne le reçois pas? Attention que c'est une Topic, pas une queue. Si il n'y a pas de subscriber enregistré, le message disparait tout de suite.

    Citation Envoyé par Lovegiver Voir le message
    -> ai-je besoin d'installer TomEE ou Geronimo qui embarquent les bons paramètres "out-of-the-box" ?
    non
    Citation Envoyé par Lovegiver Voir le message
    je regarderai de plus près quand mes gamins auront laché mon PC.
    Noie les!




    Pourrais-tu m'expliciter tes doutes, car c'est important pour moi de ne pas partir sur une mauvaise solution.
    Si tu veux faire quelque chose de similaire, par exemple, au fil d'actualité facebook, ça ne marchera pas avec des Message. un Message est posté dans un Topic JMS, tous les subscriber enregistré à ce moment là recoivent une et une seule fois le message. Donc pas question de revoir les message d'hier ou d'avant hier. Une fois consommé le message disparait à jamais.

    Ce qui m'intéressait, c'était de prévenir un utilisateur qu'il avait reçu une réponse à un message ou de prévenir l'ensemble de ses contacts qu'il avait écrit un nouveau message par exemple. Les notifications à la sauce JMS me semblaient adaptées à cet usage. Cette solution étant déjà disponible cela évitait d'avoir à prévoir dans mon modèle de données un système de notifications et d'abonnement.
    Dans cette optique restreinte ça peux faire l'affaire, Bien que d'autre solutions plus simples à mettre en oeuvre basées sur un DB seraient plus appropriées selon moi. Disons que JMS c'est de la messagerie entre programmes, pas entre personnes. Donc si le but est qu'un programme de l'utilisateur aille se connecter à ton serveur jms pour consommer les messages, ok. En n'oubliant pas qu'il ne peux pas lancer 2 fois le programme avec ton système. A moin de créer deux subscriptions séparées.
    Le use case est le suivant : tout ce qui concerne un utilisateur fait l'objet d'un nouveau message dans un topic propre à cet utilisateur. Chaque personne abonné à ce topic (donc à cet utilisateur) reçoit autant de notifs qu'il y a d'événements.
    Comme je l'ai dit, jms se concentre sur les programmes, les utilisateurs, connait pas. ton utilisateur dois recevoir son message sur quoi? Un programme de ton cru?

Discussions similaires

  1. Charger des enregistrements Depuis le code JAVA
    Par wajdopovitch dans le forum JSF
    Réponses: 0
    Dernier message: 07/04/2009, 11h55
  2. créer un label depuis le code VB 6.0
    Par y.medium dans le forum VB.NET
    Réponses: 4
    Dernier message: 13/04/2008, 04h21
  3. Créer un paquet depuis une application Java
    Par mac88 dans le forum KDE
    Réponses: 2
    Dernier message: 23/02/2008, 19h36
  4. [InitParams] Peut-on y accéder depuis le code java?
    Par ArseNic dans le forum XMLRAD
    Réponses: 2
    Dernier message: 16/05/2007, 15h23
  5. Réponses: 3
    Dernier message: 31/07/2006, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo