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

Glassfish et Payara Java Discussion :

[EJB3][JMS][Glassfish] Traitement // avec EJB => JMS


Sujet :

Glassfish et Payara Java

  1. #1
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 74
    Points : 88
    Points
    88
    Par défaut [EJB3][JMS][Glassfish] Traitement // avec EJB => JMS
    Bonjour,
    J'essaye de faire des traitements parallèles avec des EJBs, mais je suis confronté à un problème incompréhensible, j'ai besoin des lumières d'une personne calé en JMS.

    Voici un exemple simple qui illustre parfaitement mon cas d'utilisation, et surtout le problème rencontré.

    Une servlet demande à un EJB de génèrer 100 messages
    Un EJB génère les 100 messages dans une Queue.
    Des MDBs gérés par le conteneur consomment les messages.

    Hélas, avec le code qui suit, la consommation des messages ne commence qu'a la fin de la génération des 100 messages.
    Ou est le hic ?

    J'utilise Netbeans 6.9.1 et Glassfish 3.01
    Et la servlet le producteur et le consommateur sont au sein du même ear
    servlet dans war
    ejb et mdb dans jar
    le tout dans ear

    Merci d'avance



    L'essentiel code de la servlet PostMessages
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	@EJB
    	private MessagesProducerRemote messagesProducer;
     
    	protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		messagesProducer.sendMessage("msg bidon", 100);
    //....
    ]L'essentiel code de MessagesProducer
    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
     
    @Stateless
    public class MessagesProducer implements MessagesProducerRemote {
     
    	@Resource(mappedName = "jms/NewMessageFactory")
    	private ConnectionFactory connectionFactory;
    	@Resource(mappedName = "jms/NewMessage")
    	private Queue queue;
     
    	@Override
    	public void sendMessage(String body, int nb) {
    		try {
    			Connection connection = connectionFactory.createConnection();
    			while (nb > 0) {
    				Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    				MessageProducer messageProducer = session.createProducer(queue);
    				TextMessage message = session.createTextMessage(body);
    				messageProducer.send(message);
    				System.out.println("Send message : " + (nb--));
    				messageProducer.close();
    				session.close();
    			}
    			connection.close();
    		} catch (JMSException ex) {
    			ex.printStackTrace();
    		}
    	}
    L'essentiel code de MessageConsumer
    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
     
    @MessageDriven(mappedName = "jms/NewMessage", activationConfig = {
    	@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
    	@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
    public class MessageConsumer implements MessageListener {
     
    	@Resource
    	private MessageDrivenContext mdc;
    	@PersistenceContext
    	private EntityManager em;
    	private static int nb = 0;
    	private int num = 0;
     
    	public MessageConsumer() {
    		nb++;
    		num = nb;
    	}
     
    	@Override
    	public void onMessage(Message message) {
    		TextMessage msg = null;
    		try {
    			if (message instanceof TextMessage) {
    				msg = (TextMessage) message;
    				System.out.println("body = " + msg.getText() + " mdb "+num);
    			}
    		} catch (JMSException e) {
    			e.printStackTrace();
    			mdc.setRollbackOnly();
    		} catch (Throwable te) {
    			te.printStackTrace();
    		}
    	}
    }
    LE fichier sun-resource.xml definissant la queue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
    <resources>
      <admin-object-resource enabled="true" jndi-name="jms/NewMessage" object-type="user" res-adapter="jmsra" res-type="javax.jms.Queue">
        <description/>
        <property name="Name" value="PhysicalQueue"/>
      </admin-object-resource>
      <connector-resource enabled="true" jndi-name="jms/NewMessageFactory" object-type="user" pool-name="jms/NewMessageFactoryPool">
        <description/>
      </connector-resource>
      <connector-connection-pool associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-definition-name="javax.jms.QueueConnectionFactory" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="true" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="jms/NewMessageFactoryPool" pool-resize-quantity="2" resource-adapter-name="jmsra" steady-pool-size="8" validate-atmost-once-period-in-seconds="0"/>
    </resources>

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    a vue de pifomètre, et sans etre expert dans le domaine, je pense que c'est ta transaction EJB qui se prolonge, du coup, les 100 messages produits ne sont visible au consommateur qu'au moment du commit par le conteneur EJB.

    Maintenant, quand à désactiver la Tx, j'ignore

  3. #3
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 74
    Points : 88
    Points
    88
    Par défaut YES Exactly
    Citation Envoyé par tchize_ Voir le message
    a vue de pifomètre, et sans etre expert dans le domaine, je pense que c'est ta transaction EJB qui se prolonge, du coup, les 100 messages produits ne sont visible au consommateur qu'au moment du commit par le conteneur EJB.

    Maintenant, quand à désactiver la Tx, j'ignore
    Exactement, n'attendant pas la réponse ci tot, je continuais l'investiguation, et effectivement, je viens de comprendre la raison, c'est tout à fait ca. J'avais bien tenté de faire un commit sur l'objet session, mais la transaction étant gérer par le conteneur, celui me remonté une erreur.

    En fait, par défaut la transaction est géré entièrement par le conteneur. Donc celle ci commençant dans la servlet, le commit n'est fait que à la fin de l'exécution de la servlet, à savoir, la fin de la génération des 100 messages. Enfin en tous cas c'est l'interprétation que j'en fait.

    un simple rajout de l'annotation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @TransactionManagement(TransactionManagementType.BEAN)
    Sur la classe MessageProducer résout le problème. Plus qu'a faire ca au taf lundi... :-D

    En tous cas merci pour ta réactivité

  4. #4
    Rédacteur
    Avatar de longbeach
    Profil pro
    Architecte de système d’information
    Inscrit en
    Avril 2003
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Avril 2003
    Messages : 943
    Points : 2 370
    Points
    2 370
    Par défaut
    Merci de penser à utiliser le tag Résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/04/2010, 12h25
  2. JMS - JORAM - GlassFish - Problème avec JNDI
    Par Moustikos dans le forum JOnAS
    Réponses: 0
    Dernier message: 08/02/2010, 19h25
  3. Glassfish : Queue JMS pour traitement de batch par un MDB unique
    Par olikaf dans le forum Glassfish et Payara
    Réponses: 1
    Dernier message: 28/01/2009, 18h03
  4. [EJB3] Deployer sur JBOSS un EJB(3.0) avec Oracle
    Par metalpetsFR dans le forum Wildfly/JBoss
    Réponses: 11
    Dernier message: 16/08/2007, 09h42
  5. [JMS] Comment structurer avec weblogic
    Par caballero dans le forum Weblogic
    Réponses: 4
    Dernier message: 18/01/2007, 01h16

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