Écrire un servlet qui communique avec JMS (ActiveMQ) et OnMessage pour mettre à jour le site

StackOverflow https://stackoverflow.com/questions/64843

Question

Je construis un site qui utilise un simple servlet AJAX pour parler de JMS (ActiveMQ) et lorsqu'un message de la rubrique arrive pour mettre à jour le site.

J'ai un Javascript qui crée un XMLHttpRequest pour les données. Le servlet traite la requête d'obtention et renvoie le code JSON. Cependant, je ne sais pas comment connecter mon Servlet à ActiveMQ Message Broker. Il renvoie juste des données factices pour le moment.

Je pense que le Servelt devrait implémenter le messagelistener. Ensuite, onMessage envoie les données à la page JavaScript. Mais je ne sais pas comment faire cela.

Était-ce utile?

La solution

Le problème associé à l'implémentation d'un servlet dans MessageListener est que les servlets sont synchrones et les MessageListeners sont asynchrones. Au lieu de cela, vous devez créer un autre objet agissant en tant que MessageListener et mettre à jour un état quelque part (éventuellement une base de données, un MBean JMX ou un EJB Stateful Session) lorsque le message arrive. Ensuite, le servlet peut interroger cet état pour voir s'il existe des données à signaler. retour au client, et votre page Web peut régulièrement envoyer une requête ping à la servlet pour demander de nouvelles données.

Autres conseils

Comme le dit James Strachan - http://activemq.apache.org/ajax.html est une solution prête à l'emploi idéale pour votre problème.

Si vous souhaitez toujours créer une telle solution manuellement, vous pouvez simplement créer une connexion JMS dans votre servlet Ajax (connexion par demande). Envisagez d'utiliser le modèle Spring JMS pour cette raison ( http: // static .springsource.org / spring / docs / 2.5.x / reference / jms.html ). Ensuite, il suffit de recevoir le message dans la méthode Servlet doGet / doPost. Envisagez une valeur de délai d'expiration faible pour la réception dans ce cas Cette solution fonctionnera pour les files d’attente et les sujets durables.

Pour les sujets non durables, considérez l'écouteur de messages externe. Spring MessageListenerContainer est un excellent outil à cet effet:

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer
   <property name="connectionFactory" ref="jmsFactory"/>
   <property name="destination" ref="myTopic" />
   <property name="messageListener" ref="lastTenUpdatesCache" />
</bean>
Le

bean lastTenUpdatesCache sera un bean singleton implémentant MesssageListener . Ce bean serait responsable de la mise en cache des dix derniers messages (en le mettant simplement dans une liste java.util). Il sera injecté dans votre servlet Ajax afin que, dans votre méthode doGet / doPost, vous puissiez lui poser des questions sur les 10 derniers messages envoyés au sujet.

Avez-vous essayé de lire les réponses à la question reliée au Prise en charge d'ActiveMQ Ajax . Fondamentalement, ActiveMQ a un support natif pour Ajax, vous pouvez donc utiliser sa bibliothèque JavaScript pour vous abonner directement à une rubrique ActiveMQ.

Voir également les exemples Web ActiveMQ , qui expliquent comment effectuer des opérations comme en temps réel. clavarder ou écran de portefeuille d’actions en temps réel avec Ajax avec ActiveMQ

Vous devez probablement obtenir une connexion JMS de JNDI, comme ceci:

Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
    "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.setProperty(Context.PROVIDER_URL,
    "tcp://hostname:61616");
javax.naming.Context ctx = new InitialContext(props);
// lookup the connection factory
javax.jms.TopicConnectionFactory factory = 
    (javax.jms.TopicConnectionFactory)ctx.lookup("ConnectionFactory");
// create a new TopicConnection for pub/sub messaging
javax.jms.TopicConnection conn = factory.getTopicConnection();
// lookup an existing topic
javax.jms.Topic mytopic = (javax.jms.Topic)ctx.lookup("MyTopic");
// create a new TopicSession for the client
javax.jms.TopicSession session = 
    conn.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE);
// create a new subscriber to receive messages
javax.jms.TopicSubscriber subscriber = session.createSubscriber(mytopic);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top